<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>C++面向对象高级编程（下） | whoway</title>
    <meta name="description" content="Personal Blog Website">
    <link rel="icon" href="/images/photo.jpg">
  <link rel="manifest" href="/images/photo.jpg">
  <link rel="apple-touch-icon" href="/images/photo.jpg">
  <meta http-quiv="pragma" cotent="no-cache">
  <meta http-quiv="pragma" cotent="no-cache,must-revalidate">
  <meta http-quiv="expires" cotent="0">
    
    <link rel="preload" href="/assets/css/0.styles.0dbae9ec.css" as="style"><link rel="preload" href="/assets/js/app.c70e21ad.js" as="script"><link rel="preload" href="/assets/js/29.8ec842e9.js" as="script"><link rel="prefetch" href="/assets/js/10.15222a53.js"><link rel="prefetch" href="/assets/js/100.7e0e5a86.js"><link rel="prefetch" href="/assets/js/101.efd59f25.js"><link rel="prefetch" href="/assets/js/102.dfbdc06c.js"><link rel="prefetch" href="/assets/js/103.d3ab2109.js"><link rel="prefetch" href="/assets/js/104.117957ef.js"><link rel="prefetch" href="/assets/js/105.046e8ff3.js"><link rel="prefetch" href="/assets/js/106.aebdc17d.js"><link rel="prefetch" href="/assets/js/107.248733c2.js"><link rel="prefetch" href="/assets/js/108.a2fecadc.js"><link rel="prefetch" href="/assets/js/109.35196857.js"><link rel="prefetch" href="/assets/js/11.770642f2.js"><link rel="prefetch" href="/assets/js/110.cf3d973c.js"><link rel="prefetch" href="/assets/js/111.f985889a.js"><link rel="prefetch" href="/assets/js/112.ad614f41.js"><link rel="prefetch" href="/assets/js/113.f666653c.js"><link rel="prefetch" href="/assets/js/114.c6c3f384.js"><link rel="prefetch" href="/assets/js/115.e51d3c2f.js"><link rel="prefetch" href="/assets/js/116.4f4b39f5.js"><link rel="prefetch" href="/assets/js/117.99352e11.js"><link rel="prefetch" href="/assets/js/118.c6ae6572.js"><link rel="prefetch" href="/assets/js/119.4ccbe778.js"><link rel="prefetch" href="/assets/js/12.042a92ff.js"><link rel="prefetch" href="/assets/js/120.edda1c4f.js"><link rel="prefetch" href="/assets/js/121.30a638ed.js"><link rel="prefetch" href="/assets/js/122.6efcefb1.js"><link rel="prefetch" href="/assets/js/123.91e6665b.js"><link rel="prefetch" href="/assets/js/124.f27e3d7e.js"><link rel="prefetch" href="/assets/js/125.c75712d5.js"><link rel="prefetch" href="/assets/js/126.ed756cce.js"><link rel="prefetch" href="/assets/js/127.2f06c74c.js"><link rel="prefetch" href="/assets/js/128.d5f6f30e.js"><link rel="prefetch" href="/assets/js/129.508b7eed.js"><link rel="prefetch" href="/assets/js/13.b5280c37.js"><link rel="prefetch" href="/assets/js/130.dc05f9aa.js"><link rel="prefetch" href="/assets/js/131.e0ba69b1.js"><link rel="prefetch" href="/assets/js/132.d79bcaa4.js"><link rel="prefetch" href="/assets/js/133.34acc01a.js"><link rel="prefetch" href="/assets/js/134.dabf64d5.js"><link rel="prefetch" href="/assets/js/135.ad90c915.js"><link rel="prefetch" href="/assets/js/136.dbb0074f.js"><link rel="prefetch" href="/assets/js/137.284ad365.js"><link rel="prefetch" href="/assets/js/138.a4b6856f.js"><link rel="prefetch" href="/assets/js/139.c9c1e20f.js"><link rel="prefetch" href="/assets/js/14.df02ba38.js"><link rel="prefetch" href="/assets/js/140.8b0a9269.js"><link rel="prefetch" href="/assets/js/141.9c7759c5.js"><link rel="prefetch" href="/assets/js/142.a4201a82.js"><link rel="prefetch" href="/assets/js/143.d7da6e8c.js"><link rel="prefetch" href="/assets/js/144.5e48e65d.js"><link rel="prefetch" href="/assets/js/145.a0e2633c.js"><link rel="prefetch" href="/assets/js/146.3c775f9b.js"><link rel="prefetch" href="/assets/js/147.22add89a.js"><link rel="prefetch" href="/assets/js/148.cfde1009.js"><link rel="prefetch" href="/assets/js/149.ffc835b5.js"><link rel="prefetch" href="/assets/js/15.fbdfc4ee.js"><link rel="prefetch" href="/assets/js/150.406c4b20.js"><link rel="prefetch" href="/assets/js/151.b2040eea.js"><link rel="prefetch" href="/assets/js/152.7bc65661.js"><link rel="prefetch" href="/assets/js/153.1d7c65e3.js"><link rel="prefetch" href="/assets/js/154.1309de49.js"><link rel="prefetch" href="/assets/js/155.81d3ee1f.js"><link rel="prefetch" href="/assets/js/156.154a4ef2.js"><link rel="prefetch" href="/assets/js/16.e5eb6147.js"><link rel="prefetch" href="/assets/js/17.57853c4a.js"><link rel="prefetch" href="/assets/js/18.cb9d7518.js"><link rel="prefetch" href="/assets/js/19.f354dc47.js"><link rel="prefetch" href="/assets/js/2.570d8a23.js"><link rel="prefetch" href="/assets/js/20.b5af7fad.js"><link rel="prefetch" href="/assets/js/21.0b1928fe.js"><link rel="prefetch" href="/assets/js/22.f78666de.js"><link rel="prefetch" href="/assets/js/23.29c3f366.js"><link rel="prefetch" href="/assets/js/24.6f596516.js"><link rel="prefetch" href="/assets/js/25.14067b60.js"><link rel="prefetch" href="/assets/js/26.74ba4989.js"><link rel="prefetch" href="/assets/js/27.13d60edd.js"><link rel="prefetch" href="/assets/js/28.9523cb32.js"><link rel="prefetch" href="/assets/js/3.3fb3d2e0.js"><link rel="prefetch" href="/assets/js/30.805597a8.js"><link rel="prefetch" href="/assets/js/31.831b195d.js"><link rel="prefetch" href="/assets/js/32.063c672d.js"><link rel="prefetch" href="/assets/js/33.6d93fac3.js"><link rel="prefetch" href="/assets/js/34.56e8263c.js"><link rel="prefetch" href="/assets/js/35.dbe688bb.js"><link rel="prefetch" href="/assets/js/36.dc5af2c1.js"><link rel="prefetch" href="/assets/js/37.0a7494f6.js"><link rel="prefetch" href="/assets/js/38.fe4fc171.js"><link rel="prefetch" href="/assets/js/39.f5ed5e92.js"><link rel="prefetch" href="/assets/js/4.2c405ec8.js"><link rel="prefetch" href="/assets/js/40.fe7e2714.js"><link rel="prefetch" href="/assets/js/41.30b0811d.js"><link rel="prefetch" href="/assets/js/42.76f52d62.js"><link rel="prefetch" href="/assets/js/43.e7bb0817.js"><link rel="prefetch" href="/assets/js/44.ead0e883.js"><link rel="prefetch" href="/assets/js/45.235df046.js"><link rel="prefetch" href="/assets/js/46.5f09e829.js"><link rel="prefetch" href="/assets/js/47.67116354.js"><link rel="prefetch" href="/assets/js/48.31f34543.js"><link rel="prefetch" href="/assets/js/49.10b5ebba.js"><link rel="prefetch" href="/assets/js/5.6f47322c.js"><link rel="prefetch" href="/assets/js/50.c0f0b7f1.js"><link rel="prefetch" href="/assets/js/51.5143f3bf.js"><link rel="prefetch" href="/assets/js/52.eeddfd48.js"><link rel="prefetch" href="/assets/js/53.eb790db5.js"><link rel="prefetch" href="/assets/js/54.8fe5421c.js"><link rel="prefetch" href="/assets/js/55.d8f9004b.js"><link rel="prefetch" href="/assets/js/56.62ac9b92.js"><link rel="prefetch" href="/assets/js/57.a9caec0d.js"><link rel="prefetch" href="/assets/js/58.f93fc522.js"><link rel="prefetch" href="/assets/js/59.a81a03aa.js"><link rel="prefetch" href="/assets/js/6.8c2ea393.js"><link rel="prefetch" href="/assets/js/60.ab782775.js"><link rel="prefetch" href="/assets/js/61.6dd12daf.js"><link rel="prefetch" href="/assets/js/62.76f4b01f.js"><link rel="prefetch" href="/assets/js/63.6f8a4742.js"><link rel="prefetch" href="/assets/js/64.6f8bb1fa.js"><link rel="prefetch" href="/assets/js/65.4120a44b.js"><link rel="prefetch" href="/assets/js/66.360c2d2b.js"><link rel="prefetch" href="/assets/js/67.26f84d32.js"><link rel="prefetch" href="/assets/js/68.68f45e5e.js"><link rel="prefetch" href="/assets/js/69.e311eb56.js"><link rel="prefetch" href="/assets/js/7.6762b2d7.js"><link rel="prefetch" href="/assets/js/70.cea82674.js"><link rel="prefetch" href="/assets/js/71.783ddcf7.js"><link rel="prefetch" href="/assets/js/72.e5467385.js"><link rel="prefetch" href="/assets/js/73.b8fb681b.js"><link rel="prefetch" href="/assets/js/74.1bae37db.js"><link rel="prefetch" href="/assets/js/75.024387e5.js"><link rel="prefetch" href="/assets/js/76.a8e53010.js"><link rel="prefetch" href="/assets/js/77.8c55500a.js"><link rel="prefetch" href="/assets/js/78.7ce90bf5.js"><link rel="prefetch" href="/assets/js/79.ef71713f.js"><link rel="prefetch" href="/assets/js/8.788a6364.js"><link rel="prefetch" href="/assets/js/80.acad589d.js"><link rel="prefetch" href="/assets/js/81.02670d10.js"><link rel="prefetch" href="/assets/js/82.53b7b1ac.js"><link rel="prefetch" href="/assets/js/83.99eb8581.js"><link rel="prefetch" href="/assets/js/84.d1535ce3.js"><link rel="prefetch" href="/assets/js/85.fe2b7de9.js"><link rel="prefetch" href="/assets/js/86.41850272.js"><link rel="prefetch" href="/assets/js/87.1cdc6df9.js"><link rel="prefetch" href="/assets/js/88.01bf3461.js"><link rel="prefetch" href="/assets/js/89.17c69819.js"><link rel="prefetch" href="/assets/js/9.3813842d.js"><link rel="prefetch" href="/assets/js/90.f6ae7e35.js"><link rel="prefetch" href="/assets/js/91.507bc284.js"><link rel="prefetch" href="/assets/js/92.90551782.js"><link rel="prefetch" href="/assets/js/93.dc442d78.js"><link rel="prefetch" href="/assets/js/94.315f4e94.js"><link rel="prefetch" href="/assets/js/95.ccd6c6bf.js"><link rel="prefetch" href="/assets/js/96.0c6d89d0.js"><link rel="prefetch" href="/assets/js/97.1a9f10a9.js"><link rel="prefetch" href="/assets/js/98.43be3caa.js"><link rel="prefetch" href="/assets/js/99.54c8207b.js">
    <link rel="stylesheet" href="/assets/css/0.styles.0dbae9ec.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">whoway</span></a> <div class="links" style="max-width:nullpx;"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🎓Coding</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/00.Coding/TheBeautyOfProgramming/" class="nav-link">🔖编程之美题解</a></li><li class="dropdown-item"><!----> <a href="/00.Coding/CodeWarehouse/" class="nav-link">🔖代码意识流</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🚀语言</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/01.Language/Overview/" class="nav-link">🔖概述</a></li><li class="dropdown-item"><!----> <a href="/01.Language/C/" class="nav-link">⭐️C</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Cpp/" class="nav-link router-link-active">🚀C++</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Java/" class="nav-link">☕️Java</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Python/" class="nav-link">🧩Python3</a></li></ul></div></div><div class="nav-item"><a href="/02.Hardware/" class="nav-link">✔️硬件基础</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⭐️软件基础</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/03.Software/01.DataStructureAndAlgorithm/" class="nav-link">🐾数据结构和算法</a></li><li class="dropdown-item"><!----> <a href="/03.Software/02.OS/" class="nav-link">💻操作系统</a></li><li class="dropdown-item"><!----> <a href="/03.Software/03.Net/" class="nav-link">☁️计算机网络</a></li><li class="dropdown-item"><!----> <a href="/03.Software/04.SE/" class="nav-link">✅软件工程</a></li></ul></div></div><div class="nav-item"><a href="/04.Database/" class="nav-link">🎨数据库</a></div><div class="nav-item"><a href="/05.Engineer/" class="nav-link">🔖学术/工程</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⚙️工具</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/06.Tools/01.employment/" class="nav-link">🔖求职</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/02.efficiency/" class="nav-link">🚀效能</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/03.windows/" class="nav-link">⚙️Windows</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/04.design/" class="nav-link">🧩设计</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/05.linux/" class="nav-link">🐉Linux</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/whoway" target="_blank" rel="noopener noreferrer" class="nav-link external">
  GitHub
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🎓Coding</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/00.Coding/TheBeautyOfProgramming/" class="nav-link">🔖编程之美题解</a></li><li class="dropdown-item"><!----> <a href="/00.Coding/CodeWarehouse/" class="nav-link">🔖代码意识流</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🚀语言</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/01.Language/Overview/" class="nav-link">🔖概述</a></li><li class="dropdown-item"><!----> <a href="/01.Language/C/" class="nav-link">⭐️C</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Cpp/" class="nav-link router-link-active">🚀C++</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Java/" class="nav-link">☕️Java</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Python/" class="nav-link">🧩Python3</a></li></ul></div></div><div class="nav-item"><a href="/02.Hardware/" class="nav-link">✔️硬件基础</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⭐️软件基础</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/03.Software/01.DataStructureAndAlgorithm/" class="nav-link">🐾数据结构和算法</a></li><li class="dropdown-item"><!----> <a href="/03.Software/02.OS/" class="nav-link">💻操作系统</a></li><li class="dropdown-item"><!----> <a href="/03.Software/03.Net/" class="nav-link">☁️计算机网络</a></li><li class="dropdown-item"><!----> <a href="/03.Software/04.SE/" class="nav-link">✅软件工程</a></li></ul></div></div><div class="nav-item"><a href="/04.Database/" class="nav-link">🎨数据库</a></div><div class="nav-item"><a href="/05.Engineer/" class="nav-link">🔖学术/工程</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⚙️工具</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/06.Tools/01.employment/" class="nav-link">🔖求职</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/02.efficiency/" class="nav-link">🚀效能</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/03.windows/" class="nav-link">⚙️Windows</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/04.design/" class="nav-link">🧩设计</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/05.linux/" class="nav-link">🐉Linux</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/whoway" target="_blank" rel="noopener noreferrer" class="nav-link external">
  GitHub
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav>  <ul class="sidebar-links"><li><div class="sidebar-group first"><p class="sidebar-heading open"><span>C++面向对象高级编程（下）</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#📑-目录" class="sidebar-link">📑 目录</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#✅核心中英文对照" class="sidebar-link">✅核心中英文对照</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_01-导读" class="sidebar-link">01.导读</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_1-1-你应该具备的基础" class="sidebar-link">1.1.你应该具备的基础</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_1-2-我们的目标" class="sidebar-link">1.2.我们的目标</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_1-3-参考书籍" class="sidebar-link">1.3.参考书籍</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_02-conversion-function⭐️『class→其他type』" class="sidebar-link">02.conversion function⭐️『class→其他type』</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_2-1-转换函数诡异的语法" class="sidebar-link">2.1.转换函数诡异的语法</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_2-2-别名⭐️" class="sidebar-link">2.2.别名⭐️</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_03-non-explicit-one-argument-constructor" class="sidebar-link">03.non-explicit one argument constructor</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_3-1-术语argument和parameter辨析" class="sidebar-link">3.1.术语argument和parameter辨析</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_3-2-explicit关键字" class="sidebar-link">3.2.explicit关键字</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_3-3-explicit作用于『构造函数』的实质『记忆-理解』⭐️" class="sidebar-link">3.3.explicit作用于『构造函数』的实质『记忆+理解』⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_3-4-explicit用途⭐️" class="sidebar-link">3.4.explicit用途⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_3-5-『explicit需要修正』⭐️" class="sidebar-link">3.5.『explicit需要』⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_3-6-『设计手法』—代理" class="sidebar-link">3.6.『设计手法』—代理</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#✅类的模仿" class="sidebar-link">✅类的模仿</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_04-pointer-like-classes" class="sidebar-link">04.pointer-like classes</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_4-1-智能指针" class="sidebar-link">4.1.智能指针</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_4-2-『语言设计的一个bug』智能指针重载" class="sidebar-link">4.2.『语言设计的一个bug』智能指针重载-&gt;</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_4-3-迭代器—作为另外一种智能指针⭐️" class="sidebar-link">4.3.迭代器—作为另外一种智能指针⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_4-4-迭代器的特别之处" class="sidebar-link">4.4.迭代器的特别之处</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_05-function-like-classes" class="sidebar-link">05.function-like classes</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_5-1-仿函数" class="sidebar-link">5.1.仿函数</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_5-2-面试—空类的大小" class="sidebar-link">5.2.面试—空类的大小</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_06-namespace经验谈" class="sidebar-link">06.namespace经验谈</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#✅模板专题" class="sidebar-link">✅模板专题</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_07-class-template" class="sidebar-link">07.class template</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_08-funtion-template" class="sidebar-link">08.Funtion Template</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_8-1-实参推导⭐️" class="sidebar-link">8.1.实参推导⭐️</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_09-member-template-『成员模板』" class="sidebar-link">09.Member Template 『成员模板』</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_9-1-成员模板的例子🧐" class="sidebar-link">9.1.成员模板的例子🧐</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_9-2-术语『向上转型』up-cast⭐️" class="sidebar-link">9.2.术语『向上转型』up-cast⭐️</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#✅模板高级主题" class="sidebar-link">✅模板高级主题</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_10-specialization-『模板特化』" class="sidebar-link">10.specialization 『模板特化』</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_10-1-一种奇特的“临时对象”的语法⭐️" class="sidebar-link">10.1.一种奇特的“临时对象”的语法⭐️</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_11-模板偏特化-『template-partical-speciation』" class="sidebar-link">11.模板偏特化 『template Partical Speciation』</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_11-1-『个数的偏』⭐️" class="sidebar-link">11.1.『』⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_11-2『范围的偏』⭐️" class="sidebar-link">11.2『』⭐️</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_12-template-template-parameter-模板模板参数-『没看懂』⭐️" class="sidebar-link">12.template template parameter,模板模板参数 『没看懂』⭐️</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_12-1-什么情况typename和class共同？⭐️" class="sidebar-link">12.1.什么情况typename和class共同？⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_12-2-看看2-0中奇怪的语法using⭐️" class="sidebar-link">12.2.看看2.0中奇怪的语法using ⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_12-3-引入c-2-0的新语法『template-typename-t-using-lst-list-t-allocator-t-⭐️" class="sidebar-link">12.3.引入C++2.0的新语法『template;⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_12-4-智能指针在本专题的『特殊表现』⭐️" class="sidebar-link">12.4.智能指针在本专题的『特殊表现』⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_12-5-不是template-template-parameter『易错：这不正确』⭐️" class="sidebar-link">12.5.不是template template parameter『易错：这不正确』⭐️</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_13-关于c-标准库" class="sidebar-link">13.关于C++标准库</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_13-1-学习态度和方法" class="sidebar-link">13.1.学习态度和方法</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_13-2-了解你的编译器对c-2-0的支持度" class="sidebar-link">13.2.了解你的编译器对C++2.0的支持度</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_13-3-devc-上iso-c-11开关" class="sidebar-link">13.3.DevC++上ISO C++11开关</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_13-4-vs系列的看是否支持c-11" class="sidebar-link">13.4.VS系列的看是否支持C++11</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_14-三个主题c-11" class="sidebar-link">14.三个主题C++11</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_14-1-主题1、variadic-templates，数量不定的模板参数『震撼弹』" class="sidebar-link">14.1.主题1、variadic templates，『震撼弹』</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_14-2-语法糖的概念⭐️" class="sidebar-link">14.2.语法糖的概念⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_14-3-主题2、auto" class="sidebar-link">14.3.主题2、auto</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_14-4-主题3、新的for循环" class="sidebar-link">14.4.主题3、新的for循环</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_15-reference-『引用』" class="sidebar-link">15.Reference 『引用』</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_15-1-面试-引用的本质⭐️" class="sidebar-link">15.1.面试-引用的本质⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_15-2-『sizeof-引用-编译器制造的假象』⭐️" class="sidebar-link">15.2.『sizeof(引用)-编译器制造的假象』⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_15-3-『面试-个人补充』待考察" class="sidebar-link">15.3.『面试-个人补充』待考察</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_15-4-传引用和传value是不能并存的『函数签名』⭐️" class="sidebar-link">15.4.传引用和传value是不能并存的『函数签名』⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_15-5-『const和签名』" class="sidebar-link">15.5.『const和签名』</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#✅对象模型（object-model）" class="sidebar-link">✅对象模型（Object Model）</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_16-复合-继承关系下的构造和析构" class="sidebar-link">16.复合&amp;继承关系下的构造和析构</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_16-1-复合关系下的『构造和析构』" class="sidebar-link">16.1.复合关系下的『构造和析构』</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_16-2-继承关系下的构造和析构" class="sidebar-link">16.2.继承关系下的构造和析构</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_16-3-继承和组合关系下的『构造和析构』" class="sidebar-link">16.3.继承和组合关系下的『构造和析构』</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_16-4-c-规格书没有说的『坑』⭐️✅" class="sidebar-link">16.4.C++规格书没有说的『坑』⭐️✅</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_17-关于vptr和vtbl" class="sidebar-link">17.关于vptr和vtbl</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_17-1-虚指针和虚表的『核心图』⭐️" class="sidebar-link">17.1.虚指针和虚表的『核心图』⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_17-2-关键点：观察如何找虚指针！⭐️" class="sidebar-link">17.2.关键点：观察如何找虚指针！⭐️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_17-3-『面试常考-动态绑定3条件』⭐️" class="sidebar-link">17.3.『面试常考-动态绑定3条件』⭐️</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_18-关于this指针『另一个对付虚机制的法宝』⭐️" class="sidebar-link">18.关于this 指针『另一个对付虚机制的法宝』⭐️</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_18-1-『this指针—分析继承体系的金钥匙』⭐️" class="sidebar-link">18.1.『this指针—分析继承体系的金钥匙』⭐️</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_19-关于dynamic-binding『动态绑定』" class="sidebar-link">19.关于Dynamic Binding 『动态绑定』</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#✅『补充主题const』" class="sidebar-link">✅『补充主题const』</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#temp-1-『const不能放置的？』" class="sidebar-link">temp.1.『const不能放置的？』</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#temp-2-『非常易错的结论』-写时复制" class="sidebar-link">temp.2.『非常易错的结论』+写时复制</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_20-关于new-delete" class="sidebar-link">20.关于New,Delete</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_20-1-『new和delete一系列混淆概念』" class="sidebar-link">20.1.『new和delete一系列混淆概念』</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_20-2-『侯捷的失误』" class="sidebar-link">20.2.『侯捷的失误』</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_21-operator-new，operator-delete" class="sidebar-link">21.operator new，operator delete</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_22-示例-22" class="sidebar-link">22.示例 22</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_22-1-『易错-前面加上了cout这种设计』" class="sidebar-link">22.1.『易错-前面加上了cout这种设计』</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_23-重载new-delete-示例-23" class="sidebar-link">23.重载new(),delete()$示例  23</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_23-1-placement-new『好像是乱入的知识点』" class="sidebar-link">23.1.placement new『好像是乱入的知识点』</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_23-2-『whoway关于placement-new的思考』" class="sidebar-link">23.2.『whoway关于placement new的思考』</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_23-3-『关于delete的疑问』" class="sidebar-link">23.3.『关于delete的疑问』</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_23-4-『工程经验』" class="sidebar-link">23.4.『工程经验』</a></li></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#_24-basic-string使用new-extra-扩充申请量" class="sidebar-link">24.Basic_String使用new(extra)扩充申请量</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT02.C%2B%2B%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B%E4%B8%8B.html#参考资料" class="sidebar-link">参考资料</a><ul class="sidebar-sub-headers"></ul></li></ul></div></li></ul> </div> <div class="page"> <div class="content"><h1 id="c-面向对象高级编程（下）"><a href="#c-面向对象高级编程（下）" class="header-anchor">#</a> C++面向对象高级编程（下）</h1> <ul><li>C++98</li> <li>已完结『本部分』</li></ul> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>&lt;font style=&quot;background: yellow&quot;&gt;
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h2 id="📑-目录"><a href="#📑-目录" class="header-anchor">#</a> 📑 目录</h2> <p>[TOC]</p> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>01.导读1
02.conversion function『转换函数』
	- 区分：conversion function和转换构造函数
03.non-explicit one argument constructor
	- explicit既可以修饰：转换函数，还可以修饰转换构造函数

一个C++的class它做出来，可能会像2种东西！！很特别的2种东西
- 指针『智能指针、迭代器』
- 函数『仿函数』
04.pointer-like classes
05.function-like classes
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h2 id="✅核心中英文对照"><a href="#✅核心中英文对照" class="header-anchor">#</a> ✅核心中英文对照</h2> <ul><li>区分：『类型转换函数』和『转换构造函数』和explicit
<ul><li>conversion function『<strong>转换函数</strong>』<font style="background:yellow;">『转换函数是将class→其他类型』</font></li></ul></li> <li>03.non-explicit one argument constructor</li> <li>区分：<font style="background:yellow;"><strong>我们不能说：one parameter，这是two  parameter，但是one argument!</strong></font> <ul><li>parameter，参数</li> <li>argument，实参</li></ul></li> <li>区分模板：『<strong>所以，模板主要分为3大类：类模板，函数模板，成员模板』</strong> <ul><li>07.<code>class template</code>『类模板』</li> <li>08.<code>Funtion Template</code>『函数模板』</li> <li>09.<code>Member Template</code> 『成员模板』</li></ul></li></ul> <h2 id="_01-导读"><a href="#_01-导读" class="header-anchor">#</a> 01.导读</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711162244133.png" alt="image-20210711162244133"></p> <ul><li><p>本部分课程，还谈到<strong>模板</strong>、<strong>泛型</strong>。这个其实是另外<strong>1大支</strong>，是另外一条技术主轴。它和面向对象不太一样。</p></li> <li><p>所以，我们标题是『兼谈对象模型』，这个课程里面，会专门有1个单元去谈『对象模型』</p></li> <li><p>互勉：勿在浮沙筑高台：<strong>我们的基础要够深入，我们往上建的大楼才能够稳固！</strong></p></li></ul> <h3 id="_1-1-你应该具备的基础"><a href="#_1-1-你应该具备的基础" class="header-anchor">#</a> 1.1.你应该具备的基础</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711162335639.png" alt="image-20210711162335639"></p> <ul><li>这是上个课程的续集，也会讲前面一些课程中提过一些的东西，把它谈论得更加深入。</li> <li>框框，框出来的C++11部分，我只会谈3个主题！</li> <li>因为有另外一门课程会专门讨论C++11</li></ul> <h3 id="_1-2-我们的目标"><a href="#_1-2-我们的目标" class="header-anchor">#</a> 1.2.我们的目标</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711162711256.png" alt="image-20210711162711256"></p> <ul><li>『泛型编程』和『面向对象编程』是C++的2大技术主流！</li> <li>你将获得的代码<code>Test-Cpp.cpp</code></li></ul> <h3 id="_1-3-参考书籍"><a href="#_1-3-参考书籍" class="header-anchor">#</a> 1.3.参考书籍</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711162749553.png" alt="image-20210711162749553"></p> <ul><li>高级书籍『专家经验』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711162904145.png" alt="image-20210711162904145"></p> <ul><li>由于C++很庞大，非常复杂，所以我们很需要一些专家经验！</li> <li>专家告诉我们什么该做，什么不该做。<strong>最左边的，是全部都在讲C++2.0的特性</strong>。《Effective Modem C++》</li> <li>这些书就很薄了，先前的『百科全书是1k页左右，这基本是250-300左右』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711162930428.png" alt="image-20210711162930428"></p> <ul><li>C++库是不可少的，所以我们可以看这几本。</li> <li>STL的思维，是『泛型编程』思维。</li> <li>注意：继承的关系在『标准库』中用得非常少，这句话 是适用于<strong>以前</strong>的版本。</li> <li>现在的版本，同样的一件事情，在新的版本中被切割得好几个class，那它确实继承关系就很重！这导致我们，如果真的要去学标准库要去怎么做的话！困难度大大提升！</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711163012893.png" alt="image-20210711163012893"></p> <ul><li>编译器行为</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711163039107.png" alt="image-20210711163039107"></p> <ul><li>学习的内容『前面的PPT说了』</li></ul> <h2 id="_02-conversion-function⭐️『class→其他type』"><a href="#_02-conversion-function⭐️『class→其他type』" class="header-anchor">#</a> 02.<code>conversion function</code>⭐️『class→其他type』</h2> <blockquote><p>conversion function『<strong>转换函数</strong>』</p></blockquote> <blockquote><p>第1个，我们谈论『转换函数』</p></blockquote> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711163249003.png" alt="image-20210711163249003"></p> <ul><li><p><strong>Question</strong>：『转换函数』——谁把谁转换成什么呢？</p></li> <li><p><strong>Answer</strong>：class它所做出来的对象，它可不可以被转换为另外一种类型？或者是另外一种类型可不可以转为A『一个是转出去，一个是转进来！』这2个方向，我们都要谈论。<font style="background:yellow;">『转换函数是将class→其他类型』</font></p></li></ul> <h3 id="_2-1-转换函数诡异的语法"><a href="#_2-1-转换函数诡异的语法" class="header-anchor">#</a> 2.1.<code>转换函数</code>诡异的语法</h3> <ul><li>先谈，<font style="background:yellow;">转出去！『对象转换为其他类型』</font></li> <li><font style="background:yellow;">『转换函数是将class→其他类型』</font></li></ul> <p>设计一个分数class，你可以想象：除完能转换为一个double。作为1个设计者，我会认为，我设计1个分数class应该很合理的，可以被当做一个double。所以在后面被使用的场景之中，如果编译器把分数当成一个double，我会认为很合理，于是我会写一个『<strong>黄色部分的代码</strong>』</p> <p><strong>诡异的语法</strong>：</p> <ul><li>一定是operator开头，中间空1格，至于要转为什么类型呢？那个类型呢，就成为它名称的一部分。『23333，奇怪的语法』</li> <li>注意：<font style="background:yellow;">仔细观察，它和<strong>运算符重载</strong>是<strong>不一样</strong>的！</font></li></ul> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>这个函数很特别：

00、这个函数的意思是，我这个分数类，要可以被转为double。
『编译器，你在碰到任何需要把我的分数类转为double的时候，你就来调用黄色部分的这个函数！我允许你调用！』


1、函数名称叫作`operator double`，这个是一个整体！！！

2、参数的话。『『不可以有参数』』，转换嘛，哪有什么参数！！

3、return type呢？？按理说，转换之后就是double咯，『但是**C++说，你不用写！因为后面你已经写了，如果你前面又写，又写错了，自己矛盾怎么办呢？？那算了，你不用写！！**！』
那么，返回类型是什么？就是名称里面的这个东西！！

4、另外，转换语法上还有什么特点呢？因为转换『**不可能**』去改变class里面的Data！

5、所以，『**这种转换函数，通常都会加上const**』『我讲，通常的意思是：如果你在设计它，你没有加const，那编译也会通过！
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><ul><li><strong>因此这种函数就叫作『转换函数』，这是一个很特殊的术语！是没有return type（返回类型的）！</strong></li> <li>不过，我们在上一课程，<strong>非常强调：const该加就要加！！这个考验你的。。。也许在某种情况下，在那种情况下会出错『上一个课程提到了！！！</strong>』『那样<font style="background:yellow;">，那就是你设计者的责任咯！！！』</font></li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token keyword">operator</span> <span class="token keyword">double</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">const</span>
<span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">double</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token comment">////////);</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><ul><li>这样写好，之后，我们看看他什么时候会被调用起来？？</li> <li>编译器编译到那个地方的时候：它手上有几个筹码！它要去看看，到底你设计了哪些函数？这些函数，能不能被编译器在这一行让他通过？？编译器正在找：</li></ul> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>1、有没有写一个『『全局的函数』』？叫作operator +的动作，并且第1个参数是int，当然是浮点数也是可以，因为整数可以转为浮点数嘛。。而第2个参数是分数类，，如果能找到，那么这一行能通过
2、设法继续找一找？？『『试图把F转换为double』』，于是就去找找看，你有没有设计这样的一个转换函数？？『它找到了，黄色的部分，于是就

</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ul><li><font style="background:yellow;"><strong>注意：任何一个class，只要你认为合理，你都可以设计写好几个</strong>『转换函数』</font></li> <li>比如<code>operator string</code></li> <li>注意：此外，<font style="background:yellow;">转换过去！<strong>不一定</strong>要是什么『基本类型』啊！</font>任何一个type，只要这个type，先前出现过，那编译器编译到这的时候『认得』，这样就可以！</li></ul> <h3 id="_2-2-别名⭐️"><a href="#_2-2-别名⭐️" class="header-anchor">#</a> 2.2.别名⭐️</h3> <ul><li>HACV：
<ul><li>有民间说法将『conversion function，<strong>转换函数</strong>』叫作：<strong>类型转换函数</strong></li> <li>将**用于转换的构造函数『others→class Object』**叫作：<strong>转换构造函数</strong></li></ul></li></ul> <h2 id="_03-non-explicit-one-argument-constructor"><a href="#_03-non-explicit-one-argument-constructor" class="header-anchor">#</a> 03.<code>non-explicit</code> one <code>argument</code> constructor</h2> <ul><li><p>HACV：⭐️**用于转换的构造函数『others→class Object』**可以这么理解，构造的过程，本来就是给初始化值，然后告诉你，最后变为了这个对象！</p></li> <li><p>1、<font style="background:yellow;">『本部分在<strong>C++2.0新特性</strong>中有<strong>扩展</strong>，<strong>会重复讲</strong>！』</font></p></li> <li><p>2、这个故事，<font style="background:yellow;">和上1节，是同一个故事！</font>但是，我们有改动——没有了转换函数</p></li> <li><p><font style="background:yellow;">认识『<strong>术语</strong>』。 <code>one argument</code> ，argument就是<strong>实参</strong>。</font>现在有几个参数呢？</p></li> <li><p>分子和分母，但是由于后面这个有默认值。</p></li></ul> <h3 id="_3-1-术语argument和parameter辨析"><a href="#_3-1-术语argument和parameter辨析" class="header-anchor">#</a> 3.1.术语<code>argument</code>和<code>parameter</code>辨析</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711163827322.png" alt="image-20210711163827322"></p> <ul><li><code>non-explicit one argument constructor</code> <ul><li>『绿色中就是这个东西，几个参数呢？2个，但是由于后面这个，有默认的值，所以，其实你要创造一个对象，只要给1个实际参数就可以了！这样的设计，其实是合理的，因为数学上3就是3/1』</li> <li>这样的绿色的构造函数，这样写之后，这个就叫作<strong>one argument</strong>。</li></ul></li> <li>所以，我们在讨论这种特殊的技术的语法和它的行为啊，<font style="background:yellow;"><strong>我们不能说：one parameter，这是two  parameter，但是one argument!</strong></font></li> <li><font style="background:yellow;">『『单词：<code>parameter，n.参（变）数</code>』,形式参数』</font> <ul><li>parameter，参数</li> <li>argument，实参</li></ul></li> <li>『<code>one argument</code> 其实，这句话其实不完整啊！术语也很精简，也不能把整个故事说得很精简。』</li> <li><font style="background:red;">超级易错（反人类理解的定义）</font>：
<ul><li>『<font style="background:yellow;"><strong>one argument的意思是，只要1个实参就够了！当然你给它2个实参，也可以!!</strong>』</font></li></ul></li></ul> <h3 id="_3-2-explicit关键字"><a href="#_3-2-explicit关键字" class="header-anchor">#</a> 3.2.explicit关键字</h3> <p>那么<code>explicit</code>又是什么意思呢？这个蓝色的，这是个<code>关键字</code></p> <ul><li><p>这个<strong>词语可以出现在构造函数前</strong>面，但是这里没有出现！『后面的PPT，我们有加<code>explicit</code>的构造函数』</p></li> <li><p>这个有什么特性？？</p></li> <li><p>注意，下面使用：<code>+</code>的动作发生在左边？？我的设计是右边要加上一个分数。就是分数要和分数相加。。但是调用的时候，却是<code>分数+4</code></p></li> <li><p>『这个形式和我的设计不同！！！』于是编译器，去看一看，能不能把4转为分数？？？发现，上面绿色部分，所以将他们相加了。『我们感受到了，绿色部分的代码，可以把别种东西转化为这种class，和我们前面PPT讲的正好相反』</p></li> <li><p>注意：『这些都是转化。但是我们当口语上说：<strong>转换函数，我们不是指的这种！！我们是指的上一页的PPT的『这部分，侯捷和北大郭炜的不同，或许支持侯捷的说法</strong>』』</p></li> <li><p>那么，<strong>如果加上『explicit之后会怎么样呢？？我们再往下面看</strong>。。。』</p></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711164228604.png" alt="image-20210711164228604"></p> <ul><li>至此，我们还没有加上『explicit』，我们如果绿色和黄色并存的话？？『这个时候，编译器却不知道该怎么办了？？』</li> <li>原因：编译器，它是要把4转为分数？『黄色部分』，，还是要把分数转为double？『绿色部分』</li> <li>『编译器，发现有2条可行。。当然我们说了，只要多于1条路线可行的话，<strong>编译器就不知道该走哪条？？，没有谁比较好，谁比较坏的这种判断！！</strong>！！』</li> <li>『所以这里，并存的话，歧义/二义就不知道怎么办，于是就报错』</li> <li>『<strong>所以::代码写成这样，会不会矛盾，是取决于你做的事情，，代码写成这样。会不会矛盾？？会不会二义？？ 取决于『使用者到底怎么去使用这个class』</strong></li> <li>『注意：是使用者，而不是设计者？？。。。我的理解』</li> <li>『double也就是前2页的那张能够通过：没有重载+号，然后目标是double，所以编译器知道怎么寻找到目标方式』</li> <li>『这一面通过不了，是因为重载了+号，然后就可以2条路，』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711164635158.png" alt="image-20210711164635158"></p> <h3 id="_3-3-explicit作用于『构造函数』的实质『记忆-理解』⭐️"><a href="#_3-3-explicit作用于『构造函数』的实质『记忆-理解』⭐️" class="header-anchor">#</a> 3.3.explicit作用于『构造函数』的实质『记忆+理解』⭐️</h3> <ul><li>这个<font style="background:yellow;">explicit的意思是：明确的告诉编译器说，你<strong>不要给我暗度陈仓</strong>，你不要这样子，自动的帮我做事情，我<strong>既然设计是『构造函数！』就以，我</strong>真的以构造函数的形式去需要的时候，你再来调用他们！』</font></li> <li>所以，我现在把它加上explicit，这么一来的话，你就不能把『3变成3/1』，我又明白说要那么做，你不要那么自动。于是下面的就不能那么转换，理解编译器给我们的报错信息，其实很重要。</li></ul> <h3 id="_3-4-explicit用途⭐️"><a href="#_3-4-explicit用途⭐️" class="header-anchor">#</a> 3.4.explicit用途⭐️</h3> <ul><li><font style="background:yellow;">explicit这个关键字用在什么地方呢？</font></li> <li>蛮少的
<ul><li><strong>（1）只有『不是』这里！『构造函数的前面』</strong>『刚刚说只有，是为了特别希望强调啊，让你印象深刻，</li> <li><strong>（2）他其实，另外还在模板的一个很小的地方，也用得到这个关键字</strong>』但是，太细微的一部分，也很少人去注意到它。我们也不去谈了，所以90%把，或者更多，几率，你看到这个关键字，它就是用在『构造函数』的前面。。</li></ul></li> <li>『侯捷也坑我。。好家伙，还是得创造自己的一套体系，，</li></ul> <h3 id="_3-5-『explicit需要修正』⭐️"><a href="#_3-5-『explicit需要修正』⭐️" class="header-anchor">#</a> 3.5.『explicit需要<font style="background:yellow;">修正</font>』⭐️</h3> <ul><li>我在GitHub上，找到一份资料：有把Explicit修饰『转换函数』的，代码测试如下，</li> <li>参考自： huihui/<a href="https://interview.huihut.com/#/?id=explicit%ef%bc%88%e6%98%be%e5%bc%8f%ef%bc%89%e5%85%b3%e9%94%ae%e5%ad%97" target="_blank" rel="noopener noreferrer">interview<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a> <ul><li>⭐️explicit 修饰**构造函数『others→class Object』**时，可以防止隐式转换和赋值（assignment）初始化</li> <li>⭐️explicit 修饰**转换函数『class Object→others』**时，可以防止隐式转换，但 <a href="https://zh.cppreference.com/w/cpp/language/implicit_conversion" target="_blank" rel="noopener noreferrer">『按语境转换』<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a> 除外</li></ul></li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token keyword">struct</span> <span class="token class-name">A</span>
<span class="token punctuation">{</span>
	<span class="token comment">//构造函数，但是可以转换</span>
	<span class="token function">A</span><span class="token punctuation">(</span> <span class="token keyword">int</span> <span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
	<span class="token keyword">operator</span> <span class="token keyword">bool</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
	<span class="token punctuation">{</span>
		<span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">struct</span> <span class="token class-name">B</span>
<span class="token punctuation">{</span>
	<span class="token comment">//explicit常规修饰</span>
	<span class="token keyword">explicit</span> <span class="token function">B</span><span class="token punctuation">(</span> <span class="token keyword">int</span> <span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
	<span class="token comment">//explicit修饰</span>
	<span class="token keyword">explicit</span> <span class="token keyword">operator</span> <span class="token keyword">bool</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span>
	<span class="token punctuation">{</span>
		<span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">void</span> <span class="token function">doA</span><span class="token punctuation">(</span> A a <span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">doB</span><span class="token punctuation">(</span> B b <span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	<span class="token comment">//===============================================</span>
	<span class="token comment">//-----可以转换的『构造函数』</span>
	<span class="token comment">//OK,直接初始化</span>
	A <span class="token function">a1</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token comment">//OK，『赋值』初始化</span>
	A a2 <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
	<span class="token comment">//OK，直接『列表』初始化</span>
	A a3<span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
	<span class="token comment">//OK，复制『列表』初始化</span>
	A a4 <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
	
	<span class="token comment">//OK，允许static_cast的『显示转换』</span>
	A a5<span class="token operator">=</span><span class="token punctuation">(</span>A<span class="token punctuation">)</span><span class="token number">1</span><span class="token punctuation">;</span>

	<span class="token comment">//OK，允许从int到A的『隐式转换』</span>
	<span class="token function">doA</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">//-----『转换函数』</span>
	<span class="token comment">//OK：使用转换函数 A::operator bool() 的从 A 到 bool 的&quot;隐式转换&quot;</span>
	<span class="token keyword">if</span><span class="token punctuation">(</span> a1 <span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">//OK：使用转换函数 A::operator bool() 的从 A 到 bool 的隐式转换</span>
	<span class="token keyword">bool</span> <span class="token function">a6</span><span class="token punctuation">(</span>a1<span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">// OK：使用转换函数 A::operator bool() 的从 A 到 bool 的隐式转换</span>
	<span class="token keyword">bool</span> a7 <span class="token operator">=</span> a1<span class="token punctuation">;</span>

	<span class="token comment">// OK ：static_cast 进行直接初始化『显示转换』</span>
	<span class="token keyword">bool</span> a8 <span class="token operator">=</span> <span class="token keyword">static_cast</span><span class="token operator">&lt;</span><span class="token keyword">bool</span><span class="token operator">&gt;</span><span class="token punctuation">(</span>a1<span class="token punctuation">)</span><span class="token punctuation">;</span>

    
	<span class="token comment">//=================================================================</span>
	<span class="token comment">//explicit修饰了，可以转换的『构造函数』</span>
	<span class="token comment">// OK：直接初始化</span>
	B <span class="token function">b1</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">// 错误：被 explicit 修饰构造函数的对象不可以『赋值初始化』</span>
	B b2 <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>

	<span class="token comment">// OK：直接列表初始化</span>
	B b3<span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">;</span>

	<span class="token comment">// 错误：被 explicit 修饰构造函数的对象不可以『复制列表初始化』</span>
	B b4 <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">;</span>

	<span class="token comment">// OK：允许 static_cast 的『显式转换』</span>
	B b5 <span class="token operator">=</span> <span class="token punctuation">(</span>B<span class="token punctuation">)</span><span class="token number">1</span><span class="token punctuation">;</span>

	<span class="token comment">//-----explicit修饰的『转换函数』==========</span>
	<span class="token comment">// 错误：被explicit 修饰构造函数的对象不可以从int到B的『隐式转换』</span>
	<span class="token function">doB</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


	<span class="token comment">//非常易错！！</span>
	<span class="token comment">//OK：被explicit 修饰转换函数B::operator bool() 的对象可以从 B 到 bool 的『『按语境转换』』</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>b1<span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">//OK：被 explicit 修饰转换函数 B::operator bool() 的对象可以从 B 到 bool 的『按语境转换』</span>
	<span class="token keyword">bool</span> <span class="token function">b6</span><span class="token punctuation">(</span>b1<span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">//错误：被 explicit 修饰转换函数 B::operator bool() 的对象不可以『隐式转换』</span>
	<span class="token keyword">bool</span> b7 <span class="token operator">=</span> b1<span class="token punctuation">;</span>

	<span class="token comment">//OK：static_cast 进行直接初始化『显示转换』</span>
	<span class="token keyword">bool</span> b8 <span class="token operator">=</span> <span class="token keyword">static_cast</span><span class="token operator">&lt;</span><span class="token keyword">bool</span><span class="token operator">&gt;</span><span class="token punctuation">(</span>b1<span class="token punctuation">)</span><span class="token punctuation">;</span> 
	<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br></div></div><p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711165158585.png" alt="image-20210711165158585"></p> <ul><li>或许很好奇？</li> <li>标准库，这么一大块的一个东西，有没有哪个用到转换函数『class Object→others』</li> <li>如果我能够找到的话。更加能够说服我。转换函数还真是有用啊</li> <li>在<strong>标准库中，我找到了一个例子，如上</strong>『这个语法有点奇怪啊，这个叫『<strong>模板的偏特化</strong>』现在还没谈论到。</li></ul> <h3 id="_3-6-『设计手法』—代理"><a href="#_3-6-『设计手法』—代理" class="header-anchor">#</a> 3.6.『设计手法』—代理</h3> <ul><li>这个容器，设计了这样的一个函数，『我们要注意的是：它传回的是什么？？是个reference？？</li> <li>我们发现他是typedef的，它<strong>是另外一个class</strong>换了个名称。『这个<strong>在设计手法上，叫作：proxy，代理</strong>』———用这个，用传回来的这个东西，去代表，去代理。它本来真正应该传回来的东西。</li> <li>『关于这个设计手法，我们现在不去谈它』—这<strong>是一个有名的设计模式</strong>。『设计模式就很高阶的一个主题了，我们不去谈他们』它谈的这个东西，应该要代表一个bool值，对不对？？但是传回的是refernce。<strong>那么这个东西，自自然然的就应该有个转换函数转换为bool『牛皮，这样我的STL源代码理解更加OK了</strong>』</li> <li>你拿A去代表B，那么A应该有个转换函数，转为B。应该是要这么设计，这是合理的，果然，它传回的是这个。『下面框框的代码』</li></ul> <h2 id="✅类的模仿"><a href="#✅类的模仿" class="header-anchor">#</a> ✅类的模仿</h2> <ul><li>接下来要谈的是：一个C++的class它做出来，可能会像2种东西！很特别的2种东西。我们分别来谈他们</li> <li>1、这个class做出来之后，所产生出来的对象像1个『指针』，我们叫作『pointer-like class』</li> <li>2、这个class做出来之后，所产生出来的对象像1个『函数』，我们叫作『fuction-like class』</li></ul> <h2 id="_04-pointer-like-classes"><a href="#_04-pointer-like-classes" class="header-anchor">#</a> 04.<code>pointer-like</code> classes</h2> <ul><li><font style="background:yellow;">Question：<strong>你为什么要把一个class设计出来，让他像一个指针呢？</strong></font></li> <li>Answer：因为你想要比指针再<strong>多做一点事情</strong>！</li> <li>『所以，通常，这样子做出来的东西，我们又把它叫作“智能指针”，就像智能手机一样，比传统的手机更加聪明一些，比指针更聪明，我们叫智能指针』</li></ul> <h3 id="_4-1-智能指针"><a href="#_4-1-智能指针" class="header-anchor">#</a> 4.1.智能指针</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711165530210.png" alt="image-20210711165530210"></p> <ul><li>C++在2.0之前，有一个智能指针叫作：<code>auto_ptr</code>，在2.0之后，有好几个智能指针。『包括现在看到的<code>shared_ptr</code>』</li> <li>它们的长相，都类似这样，这里头一定会有一个真正的指针，图中，大圈圈是智能指针，里头就是真正的C++指针。</li> <li><strong>上面的代码，是早期的写法</strong>，但是在2.0之后，整个就变得很复杂了，多了很多的class，原本是一个class可以做的事情，变成好几个class</li> <li><code>*sp</code>这个的意思是：等于就是要<font style="background:yellow;">（<strong>中文叫”解参考“，derefernce</strong>），就是<strong>去拿那个东西</strong>。</font></li></ul> <h3 id="_4-2-『语言设计的一个bug』智能指针重载"><a href="#_4-2-『语言设计的一个bug』智能指针重载" class="header-anchor">#</a> 4.2.『语言设计的一个bug』智能指针重载<code>-&gt;</code></h3> <blockquote><p><font style="background:yellow;"><strong>一个语言设计上的bug</strong>？？HACV注</font></p></blockquote> <ul><li><p>关于这个重载，不只是新手，<strong>很多C++的老经验的人，也都卡在这个地方</strong>，过不去。因为没有办法会解释它的行为，也许会写！看多就会写。『<strong>熟读唐诗三百首，不会作诗也会吟</strong>』</p></li> <li><p>我们来看一下，PPT右边（右下角），<font style="background:yellow;">如果使用者这么用<code>sp-&gt;method()</code>的话！是什么意思？</font></p></li> <li><p>意思<code>等同于</code>下面的，『使用者使用智能指针的想法，是要这样，现在』。但是<code>-&gt;</code><strong>不是已经消耗掉了吗？</strong></p></li> <li><p>为什么还有呢？？『我也疑惑这里』</p> <ul><li>1、这个想法是对的，从符号的角度，解释不下去了。</li> <li>2、『该怎么解释呢？<font style="background:yellow;"><strong>箭头符号，有个特殊的行为，作用下去得到的结果，这个箭头符号会继续作用下去！</strong>！』</font></li> <li><font style="background:yellow;">那为什么。只有这个符号会这样呢？没有什么特别。C++语法规定。<strong>因为这样子解释才解释得通</strong>，它要有一个！</font></li> <li>『因为语言整个是人设计出来的，左边这样，右边这样**，它要这样解释，才能去呼应，它可以这样写**』</li></ul></li> <li><p>智能指针，里面一定要写 <code>*</code> 和 <code>-&gt;</code></p></li></ul> <h3 id="_4-3-迭代器—作为另外一种智能指针⭐️"><a href="#_4-3-迭代器—作为另外一种智能指针⭐️" class="header-anchor">#</a> 4.3.迭代器—作为<code>另外一种智能指针</code>⭐️</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711170005192.png" alt="image-20210711170005192"></p> <ul><li>C++标准库，里面有很重要的东西。<strong>如果你是新手，现在是大学生的话，我强烈建议你去开始使用库</strong>！那么你在使用库的时候，会有一个很重要的东西。就是容器，容器本身一定带着迭代器。</li> <li>现在只谈『<strong>迭代器，作为另外一种，智能指针，我们要注意它的操作符重载</strong>』</li> <li>『这个分类绝了。牛皮』</li></ul> <blockquote><p>所以，迭代器干什么呢？它就是要代表，容器里面的一个元素。它要去指向一个元素，因此它也想一个指针。你也可以说它就是智能指针。</p></blockquote> <h3 id="_4-4-迭代器的特别之处"><a href="#_4-4-迭代器的特别之处" class="header-anchor">#</a> 4.4.迭代器的特别之处</h3> <p>但是这种智能指针（指的是“迭代器”）和上一页，长相略有不同。</p> <ul><li>1、迭代器，这种智能指针，<font style="background:yellow;">不但要去处理，<code>*</code>和<code>-&gt;</code>符号，它还要去处理<code>++</code>，<code>--</code>，<code>==</code>和<code>!=</code></font></li> <li>2、<strong>『迭代器之外的智能指针，可能不必要去处理++或--』</strong>，因为它没有所谓的这个东西</li> <li>3、<code>++</code>和<code>--</code>仅仅在指针移动。迭代器的主要用途：用来遍历容器</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711170216200.png" alt="image-20210711170216200"></p> <ul><li>这样，<font style="background:yellow;">由于<strong>右边的需求</strong>，所以，我们知晓了左边那么设计的原因。</font></li></ul> <h2 id="_05-function-like-classes"><a href="#_05-function-like-classes" class="header-anchor">#</a> 05.<code>function-like</code> classes</h2> <ul><li>设计1个class，让他的行为像一个函数。</li> <li>可能好奇：为什么C++为什么要一个class所创造出来的对象，像指针或者像函数。</li> <li>『好像也难以，一言以蔽之。』我们先不谈它把，后头更多的课程中，或许你会有好的体会。</li> <li>我们现在讨论『<strong>语言层面</strong>』如何让他变成像个指针Or函数。</li></ul> <h3 id="_5-1-仿函数"><a href="#_5-1-仿函数" class="header-anchor">#</a> 5.1.仿函数</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711170500038.png" alt="image-20210711170500038"></p> <ul><li>如何像个函数，函数长啥样？</li> <li>名称，小括号<font style="background:yellow;">『<strong>其实小括号，这个操作符叫作function call operator，函数调用操作符</strong>』</font>所以，<strong>任何一个东西，如果能够接受，<code>小括号这个操作符</code></strong>，『『我们就叫这个东西叫作一个函数，或者叫作一个像函数的东西。』』</li> <li>PPT中『灰色』是有东西的，只是现在讲解不需要，所以先去掉。其实是它有另外继承另外一个class。</li> <li>PS：我看《STL源码剖析》的时候也看到了</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711170607518.png" alt="image-20210711170607518"></p> <ul><li>标准库中有这么3个东西，上面的3个并不是C++标准库，规格书中所说的3个，规格书中，没有说有这3个，是GNUC里面额外给的，<strong>在VC啊，你可能就找不到</strong>！</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711170721925.png" alt="image-20210711170721925"></p> <ul><li>其实，也都继承了，但是好像PPT动态的没有出来。</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711170738343.png" alt="image-20210711170738343"></p> <ul><li>被继承的，就是这2个！！『<strong>为何要继承这个东西呢？这是个蛮大的题目，我有另外一个课程，谈到标准库，就会取谈论，为什么要继承这些东西？</strong>』</li> <li>现在是让你看一下他们的全貌。</li></ul> <h3 id="_5-2-面试—空类的大小"><a href="#_5-2-面试—空类的大小" class="header-anchor">#</a> 5.2.面试—<code>空类的大小</code></h3> <blockquote><p><strong>问个问题，如何知道他们的大小</strong>。</p></blockquote> <ul><li>1、没有函数。也没有数据，你可能很少写过这样奇怪的class。它的大小也是0，不过，你很好奇，把这段写到你的代码中去。然后sizeof，去看看他们的大小，你可能得到的是1</li> <li>2、<strong>理论上是0</strong>，实现上，由于一些限制，得到的可能是1『面试考』</li></ul> <h2 id="_06-namespace经验谈"><a href="#_06-namespace经验谈" class="header-anchor">#</a> 06.namespace经验谈</h2> <ul><li>这是一个『很小的题目』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711170815913.png" alt="image-20210711170815913"></p> <ul><li>其实<code>namespace</code>主要就是把一些东西区隔开来：</li> <li>因为现在设计软件是<font style="background:yellow;">团队作业，也许A、B两个部门独立作业，没有沟通，以致于开发出来的函数或者变量或者类的名称冲突</font>『这不是不可能的事情』所以，namespace就是：你自己再取一个名字再把你所有东西包起来，要是这个名字A和B也冲突了『那就没办法了2333』『但这个很好解决了吧』</li> <li>在侯捷中，它给大家的测试程序都是用<code>namespace</code>给包起来的。</li></ul> <h2 id="✅模板专题"><a href="#✅模板专题" class="header-anchor">#</a> ✅模板专题</h2> <ul><li>接下来，我们有好几张小图片，我们要谈论的是模板。</li></ul> <h2 id="_07-class-template"><a href="#_07-class-template" class="header-anchor">#</a> 07.<code>class template</code></h2> <ul><li>已经提过，复数是个模板类或者叫<code>类模板</code>（侯捷这里，说错了？<font style="background:yellow;">我觉得是的，侯捷他说错了！</font>）</li> <li>HACV：这句话在国内的翻译书中，是完全不同的概念！
<ul><li>模板类，重点是class</li> <li>类模板，重点是模板</li></ul></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711171454716.png" alt="image-20210711171454716"></p> <ul><li>这个『泛型编程』的理解其实比『面向对象』更简单</li> <li>面向对象当牵扯到『继承、虚函数的时候』如果层次太多，其实是很复杂的，要去理解它很痛苦！</li></ul> <h2 id="_08-funtion-template"><a href="#_08-funtion-template" class="header-anchor">#</a> 08.<code>Funtion Template</code></h2> <h3 id="_8-1-实参推导⭐️"><a href="#_8-1-实参推导⭐️" class="header-anchor">#</a> 8.1.实参推导⭐️</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711171546606.png" alt="image-20210711171546606"></p> <ul><li>关键字。class可以改为typename</li> <li>函数模板比<code>class模板</code>还，函数模板在使用的时候，是不必要去指明type的</li> <li>『调用的时候要放参数，于是<font style="background:yellow;">编译器就做动作——<strong>arguement dedutcion，实参推导。</strong>』就能够根据你调用时候的参数（实参）是什么，推导出这个T是什么。</font></li> <li>『模板的编译，<strong>模板块本身的编译</strong>，编译出来的也是一个半成品，不能保证后头一定会成功。所谓后头，就是后头<strong>使用的时候，会再编译一次</strong>。对应的代码就是<code>r3=min(r1,r2);</code>『注意，使用这个词语』</li> <li>注意：模板往往会写成一个，不管是<code>.h</code>还是<code>.cpp</code>，<strong>它本身可以编译通</strong>过。但是真正**使用的时候，**你的应用程序本身还会再编译一次，那时候过不过就不知道了！如果 ，stone没找打<code>&lt;</code>的重载，就会报错，找不到这个。</li></ul> <h2 id="_09-member-template-『成员模板』"><a href="#_09-member-template-『成员模板』" class="header-anchor">#</a> 09.<code>Member Template</code> 『成员模板』</h2> <ul><li>语法是，下面这样。</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711172208233.png" alt="image-20210711172208233"></p> <ul><li>『<font style="background:yellow;">黄色这一部分，就是成员模板</font>』什么意思呢？？
<ul><li>黄色这一块，是模板里面的member，而他自己本身又是一个template，我们<strong>就把黄色这个部分，叫作『member template』</strong></li></ul></li> <li>『这个做什么用？？你可以想象，外头的这个模板是个允<strong>许变化</strong>的东西，变化什么呢？
<ul><li><code>T1和T2</code>，而在这种变化之下，T1和T2，如果被确定了之后，<strong>里头的这一小端，又可以变化！！变化什么呢？</strong></li> <li><code>U1和U2</code>』『这个有点抽象，看下面具体的例子』</li></ul></li></ul> <h3 id="_9-1-成员模板的例子🧐"><a href="#_9-1-成员模板的例子🧐" class="header-anchor">#</a> 9.1.成员模板的例子🧐</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711172406507.png" alt="image-20210711172406507"></p> <ul><li>『往往这种成员模<strong>板，会出现在，比如说像标准库，很多很多的模板</strong>，它的构造函数就会设计成一个这种东西』</li></ul> <blockquote><p>最下角的题目答案：</p></blockquote> <p>1、当然可以！想想生活经验</p> <p>2、反之则不可以！！</p> <ul><li>所以，由于要满足这种可以和不可以！！所以，设计pair的人，它说，它要怎么反应这个事情呢？</li> <li>我允许你使用任意的——T1和T2，并且在构造我的时候，我还允许你放任意的U1和U2，，但是U1和U2必须满足这里的赋值动作！！！『这什么意思？？把p的first second，放进来，当成我本身的first和second。『所以，放进来是鲫鱼，由于可以转型为鱼类，所以才可以通过。。这整个构造函数就通过了』</li> <li>『这个就叫成员模板，或者叫模板成员，颠倒过来念都可以。。。真的嘛。。侯捷这里又错了吧，，</li> <li>『<strong>你会在标准库的大量的类的构造函数里面发现，构造函数写成这样！！</strong>』</li> <li>『<strong>为的就是让构造函数更加有弹性一些。。</strong>』『何谓弹性，就是我们先前的鱼类，鸟类，，，啥的上面的例子，自己想一下』</li> <li>『反之，如果放置的初值是鲸鱼和麻雀，那么这个构造函数就会出错，，这一块构造函数本身是正确的！！但是被运用的时候，失败了，因为使用者的原因</li> <li>『<strong>所以，模板主要分为3大类：类模板，函数模板，成员模板』</strong></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711172501724.png" alt="image-20210711172501724"></p> <ul><li>用意是：shared_ptr本身，允许你使用的时候，让他指定任意的type，而构造函数说：</li></ul> <h3 id="_9-2-术语『向上转型』up-cast⭐️"><a href="#_9-2-术语『向上转型』up-cast⭐️" class="header-anchor">#</a> 9.2.术语『向上转型』up-cast⭐️</h3> <ul><li><font style="background:yellow;"><strong>up-cast的由来</strong></font>，在面向对象的关系里面，由于父类往往画在上头，子类画在下头。。所以，这个动作是有点像指针要往上移动。『这<strong>是一定合理！！因为这是人的生活的经验</strong>』『难<strong>道不用分析类的内存分布</strong>？』
<ul><li>你有一根指针是指向动物，那么将来让他指向一只猪可以吗？可以的</li> <li>既然指针可以，那么我智能指针也必须可以，为了这种必须可以，所以，智能指针要写出这一种member templater』</li></ul></li></ul> <h2 id="✅模板高级主题"><a href="#✅模板高级主题" class="header-anchor">#</a> ✅模板高级主题</h2> <ul><li>接下来谈论特化。</li> <li>『什么叫泛化？特化的反面嘛。泛化，』</li> <li>“泛化”：就是模板</li> <li>”特化“：的意思就是，你作为一个设计者，你可能会面对某些独特的类型，做特殊的设计！！</li></ul> <h2 id="_10-specialization-『模板特化』"><a href="#_10-specialization-『模板特化』" class="header-anchor">#</a> 10.specialization 『模板特化』</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711172829724.png" alt="image-20210711172829724"></p> <ul><li>某算法，可以在两点之间快速，画点</li></ul> <h3 id="_10-1-一种奇特的“临时对象”的语法⭐️"><a href="#_10-1-一种奇特的“临时对象”的语法⭐️" class="header-anchor">#</a> 10.1.一种奇特的“临时对象”的语法⭐️</h3> <ul><li>⭐️『<strong>浅绿色的是临时对象</strong>』1000是参数的意思，框框上面是泛化，下面的都是特化『当然，这个只是中间过程。』</li> <li><strong>泛化，又叫作全泛化</strong>。<code>Full specialization</code></li> <li>对应的，叫作偏特化『也可以翻译为<font style="background:yellow;">局部特化</font>』翻译得简洁一点，就叫偏特化。</li></ul> <h2 id="_11-模板偏特化-『template-partical-speciation』"><a href="#_11-模板偏特化-『template-partical-speciation』" class="header-anchor">#</a> 11.模板偏特化 『<code>template Partical Speciation</code>』</h2> <ul><li>偏特化，或者叫『局部特化』</li> <li>可以从2个角度理解
<ul><li>1、个数上的偏『好理解</li> <li>2、范围上的偏『稍微难理解一些，但也不是多难。</li></ul></li></ul> <h3 id="_11-1-『个数的偏』⭐️"><a href="#_11-1-『个数的偏』⭐️" class="header-anchor">#</a> 11.1.『<font style="background:yellow;">个数的偏</font>』⭐️</h3> <ul><li>也就是说，如果模板有3个模板参数，</li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>，，，
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711173159586.png" alt="image-20210711173159586"></p> <ul><li>也就是说，这个模板，如果有三个，这里是2个，最上面框的上面一行叫作：模板参数。』</li> <li>你想绑定其中一个，比如这个vector可以运行你指定元素类型和一个分配器。分配器是标准库的东西，我们这里就不谈了。必须<strong>指定这2个，那这里有个默认值。好，你在设计的时候，如果这个元素是个bool值的话，好像我应该有一种特殊的设计！</strong>『为什么呢？因为在C++里面，最小单元的元素类型是char，，如果你让一个字节去代表一个bool值，是不是太浪费了啊。。』『浪费八倍。。所**以，用户想要放的是真假值，0或1的话，我觉得我可以单独为他来设计符号，而不用泛化，**因此我要告诉编译器，怎么告诉它呢？这里有2个模板参数，我说我现在只生1个，因为，另外一个被我绑定了，T被我写在下面变成bool，上面有2个，现在只剩下一个了，那个还没定，所以忍让在这里还是要写出来。。，，</li> <li>这就是语法；这种个数上的偏的语法，，『我在标准库中找到了』</li> <li>3个4个5个都可以，<strong>注意：你不能绑定1,3,5，然后，留下2,4这样是不行的！！<font style="background:yellow;">一定要从左边到右边啊！不能用跳</font>。</strong></li></ul> <h3 id="_11-2『范围的偏』⭐️"><a href="#_11-2『范围的偏』⭐️" class="header-anchor">#</a> 11.2『<font style="background:yellow;">范围的偏</font>』⭐️</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711185958689.png" alt="image-20210711185958689"></p> <ul><li><p>如果我设计，接受T。T可以是任意类型！</p></li> <li><p>解释范围的偏：<font style="background:yellow;">如果，**我把范围缩小一点的话：它是一个指针，<strong>指向任意类型。这样是不是范围缩小了？指针也是一种类型！所以从</strong>本来是任意类型，现在缩小为指针。**至于指针指向什么呢？都可以</font></p></li> <li><p>『如果你有这种运用的话，C++支持你这种想法』</p></li> <li><p>『首先**，写左上角框框的，然后你写个偏特化版本的，现在如果使用者使用的是个指针，那么就用这套代码。『好惨败无力**的？</p></li> <li><p>『作为一个初学者，上面和下面的T很容易混淆。你**把它切开来，完全就是两个T！**或者你，干脆把T换成U，这样就OK了。很多人不懂，是把下面这个特化和上面那个泛化，以为下面的T和上面的T一样，其实不一样！</p></li> <li><p><font style="background:yellow;">『当使用者，像下面去用的时候，<strong>编译器会给你另外修改</strong>。<strong>『STL源码拼写中常见</strong>。』</font></p></li></ul> <h2 id="_12-template-template-parameter-模板模板参数-『没看懂』⭐️"><a href="#_12-template-template-parameter-模板模板参数-『没看懂』⭐️" class="header-anchor">#</a> 12.<code>template template parameter</code>,<code>模板模板参数</code> 『没看懂』⭐️</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711190448783.png" alt="image-20210711190448783"></p> <ul><li><p><code>template template parameter</code>,<code>模板模板参数</code> 『套娃』</p></li> <li><p>再来，有个相当深的东西了。</p></li> <li><p>这个用途是这样：</p></li> <li><p>里头的第2个参数，本身又是一个template，我的例子是放在第2，它本身又是一个template『语法就是黄色部分，这种写法』这样子写就已经很容易懂了。<strong>一般，其实已经很少人或者书籍在讲解这个主题，这已经很高深了</strong>。这个一般会觉得这个好难，其实你看看黄色部分，其实一点都不难。</p></li></ul> <h3 id="_12-1-什么情况typename和class共同？⭐️"><a href="#_12-1-什么情况typename和class共同？⭐️" class="header-anchor">#</a> 12.1.什么情况<code>typename</code>和<code>class</code>共同？⭐️</h3> <ul><li>『曾经有学生问过我，黄色部分的，那个里面有时候写class有时候写<code>typename</code>！那这里又有出现class，到底这两者在什么时候可以共通，为什么要共通？好，我现在先告诉你：
<ul><li><font style="background:yellow;"><strong>只有</strong>在模板尖括号<code>&lt;&gt;</code>这位置上，<strong>只有</strong>这个位置上『class和Typename共通』<strong>其他地方都不可以！</strong></font></li> <li><strong>至于，他们为什么能够共通，这是个历史因素</strong>。早先并没有<code>Typename</code>这个关键字，所以在这个位置上，模板是后来才发展出来的！所以，<strong>C++就暂时下借用class！后来出现typename</strong>。</li> <li>当我们写出黄色部分之后，其实我们还要继续往下看。就是这个container，这里<strong>也只是个代名词</strong>而言。叫什么都无所谓。</li></ul></li></ul> <h3 id="_12-2-看看2-0中奇怪的语法using⭐️"><a href="#_12-2-看看2-0中奇怪的语法using⭐️" class="header-anchor">#</a> 12.2.看看2.0中奇怪的语法<code>using</code>⭐️</h3> <ul><li><strong>紫色</strong>的：这么用，意思是，我<strong>传入一个容器，并且传入容器的元素类型</strong>！『我使用者就变得很有弹性了。</li> <li>『作为设计者，当我想让我的使用者这么有弹性的时候，，我这个黄色部分就必须是个模板模板参数』</li></ul> <blockquote><p>很不幸的，<strong>紫色部分，打了个叉。。错误在哪？？这已经和这个主题无关了</strong>，模板模板参数在这里的写法是对的！只不过，真正在用的时候，这个容器，其实模板『5分30秒，没听懂』</p> <p>其实容器其实有第2模板参数，有的还有第3，那个2和3，我们平常再用的时候没有写的原因是：因为它有默认值。</p></blockquote> <ul><li>那你关于哪里，你可能认为，那对啊，那我这里就放默认值啊。诶，是，你的意思是这样。但是你的语法过不了。就是过不了。『所以很遗憾，上面的语法是对的，但是用到下面就是不行』</li></ul> <h3 id="_12-3-引入c-2-0的新语法『template-typename-t-using-lst-list-t-allocator-t-⭐️"><a href="#_12-3-引入c-2-0的新语法『template-typename-t-using-lst-list-t-allocator-t-⭐️" class="header-anchor">#</a> 12.3.引入C++2.0的新语法『<code>template&lt;typename T&gt; using Lst=list&lt;T,allocator&lt;T&gt;&gt;;</code>⭐️</h3> <ul><li>『<strong>那么如何解决这个问题呢？引入另外一个语法</strong>』：</li> <li>必须加上，第2个框框的『至于，这个框框中的2行，我就<strong>不解释了，因为他是C++2.0新增加一个语法</strong>』</li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">typename</span> <span class="token class-name">T</span><span class="token operator">&gt;</span> 
<span class="token keyword">using</span> Lst<span class="token operator">=</span>list<span class="token operator">&lt;</span>T<span class="token punctuation">,</span>allocator<span class="token operator">&lt;</span>T<span class="token operator">&gt;&gt;</span><span class="token punctuation">;</span>`
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><ul><li>『我在2.0那门课，谈到它，因为这个没有办法用1分钟，半分钟谈完。。』</li></ul> <h3 id="_12-4-智能指针在本专题的『特殊表现』⭐️"><a href="#_12-4-智能指针在本专题的『特殊表现』⭐️" class="header-anchor">#</a> 12.4.智能指针在本专题的『特殊表现』⭐️</h3> <ul><li>刚刚很遗憾啊，打了个X，所以我要找一个可以通过的——让我也许感觉更好。『所以上一页，我这个模板模板参数，我放的是容器，刚刚很不幸的打X，是因为容器需要好几个模板参数。』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711191318787.png" alt="image-20210711191318787"></p> <ul><li>现在回到这里来，我要传递进去的是智能指针，<font style="background:yellow;">而智能指针，它<strong>都</strong>只接受——一个参数，<strong>不能说都啦！</strong></font></li> <li>我其实也不是每个智能指针都非常的熟。『呃呃呃』</li> <li>我有一两个，我还挺熟的。所以我知道，至少有那么一两个，只接收一个模板参数！刚就卡在一个或2个，现在应该要能通过罗。我们看看这个设计。</li> <li>我们发现，下面有两个X，这个并不是上面设计错了。是因为，那两行，那两种智能指针独特的特性！所以，我们也不用去管他们了。『只剩下，1和4可以，我们重点不在智能指针，我们重点在上头的黄色部分，对应到标题的写法』</li></ul> <h3 id="_12-5-不是template-template-parameter『易错：这不正确』⭐️"><a href="#_12-5-不是template-template-parameter『易错：这不正确』⭐️" class="header-anchor">#</a> 12.5.不是<code>template template parameter</code>『易错：这不正确』⭐️</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711191517797.png" alt="image-20210711191517797"></p> <ul><li>有一次在现场谈到这个话题，有一位，很有经验的工程师，联想到这个。问这个是不是模板参数？？</li> <li>『不一样，这个怎么解释呢？我们现在要把它理清啊，，，当像黄色部分这么写的时候，是下面那么用！！</li> <li>是什么意思？
<ul><li>第1行解释：由于第2个有默认值，所以只指定第1个模板参数。。</li> <li>第2行解释：如果我要写第2模板参数的话，我必须这么写。<code>list&lt;int&gt;</code>它已经不是模板，<strong>虽然他是用模板设计出来的东西。但是这么写的话，已经没有任何模糊地带了。没有任何灰色地带</strong>。没有任何模板参数。。已经绑定过，已经写死了。。所以，你可以说这个，已经不再是模板了。所以你不能说：黄色那里是个<code>模板模板参数</code>。</li></ul></li> <li>『这个解释。额，我没动。。』</li> <li>『对比前面的，我们传进去的是list，然后他没有绑定任何东西，比如<code>list&lt;int&gt;</code>。这样任然是个灰色的，模糊的。』</li> <li>这样，我们才叫它是一个模板</li></ul> <h2 id="_13-关于c-标准库"><a href="#_13-关于c-标准库" class="header-anchor">#</a> 13.关于C++标准库</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711191749907.png" alt="image-20210711191749907"></p> <ul><li>这是一个太大太大的一个问题了。『我们在这门课程，和上一们基础，我们要谈的是C++语言的部分，然后标准库是另外一个部分，我没打算放在这个里头，我只是想提醒大家，库是多么的重要!』</li> <li>在不同的语言，库扮演很重要的角色。</li> <li>C++初学者， 你要去熟练他。算法有7,8十个。</li> <li>另外，其实有一些你在你想象中是比较少的动作。比如说copy，从一块地方拷贝到另外一个地方去。『这一种事情，在整个编程里面，常常需要发生，所以它的效率要非常高，所以标准库的团队要好好的设计』</li> <li>『看右边的书籍：可以很好的说明容器和算法的重要性，，在过去HIA没有网页，以及网页编程之前，现在一个学编程，很大的一致，是去制作网页，怎么做它的商业模式，但是在这个之前，古典的 ，经典的编程。这本书的署名告诉你，数据结构+算法等于程序。』所以，多么重要。</li></ul> <h3 id="_13-1-学习态度和方法"><a href="#_13-1-学习态度和方法" class="header-anchor">#</a> 13.1.学习态度和方法</h3> <ul><li><p>『作为一个学习者，我可以把我年轻时候的经验告诉大家：在我很早以前学习C语言的时候，C相对于C++实在是太简单不过了。在学习C语言之后，我们要学习什么呢？哦，C也有它的标准库，它服了，它有好几百个函数，</p></li> <li><p><strong>一个比较认真的学习者的态度是：这些函数，我通通都要用过一遍</strong>，几百个，至少我都要用过，最好我都还要调用过。这样<strong>你在真正面对问题时候，，你才知道标准库已经给您了什</strong>么！一定要傻傻的字节再写一套，写得还没它好。』所以，容器和算法你都要去测试一遍！！写个小程序去测试一下，也**不要眼高手低，反正网页上有很多代码：我就用看的，这个效果不够好！**最好你还是要去写代码测试，使用这些是很愉快的事情！！因为，它已经把你在学校里面的那些复杂的东西都已经实现出来了！你只是去用而已，还有比这个更快乐的事情吗？</p></li> <li><p>努力到这里，我们看看这些我们已经学了的清单，我们还有路线要走！</p></li> <li><p><strong>但是我在这要讲3个主题，也很少的时间就能很好的理解这个东西</strong>！一个很重要，2个是对你编程带来很大帮助性！</p></li></ul> <h3 id="_13-2-了解你的编译器对c-2-0的支持度"><a href="#_13-2-了解你的编译器对c-2-0的支持度" class="header-anchor">#</a> 13.2.了解你的编译器对C++2.0的支持度</h3> <ul><li>网站传送门：<a href="https://cpprocks.com/" target="_blank" rel="noopener noreferrer">https://cpprocks.com/<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711192153915.png" alt="image-20210711192153915"></p> <ul><li>观察支持2.0吗？用这个网站去查！感谢这些人整理！</li></ul> <h3 id="_13-3-devc-上iso-c-11开关"><a href="#_13-3-devc-上iso-c-11开关" class="header-anchor">#</a> 13.3.DevC++上<code>ISO C++11</code>开关</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711192232315.png" alt="image-20210711192232315"></p> <ul><li>我测试是选用的上面的这版本，<code>DevC++5.6</code>版本，搭载的是<code>GCC4.9.2</code></li> <li>虽然支持，但是记得要设定！不然，编译不够『<strong>图片上这样的，我还没有这么设计过，我倒是设置参数</strong>』</li></ul> <h3 id="_13-4-vs系列的看是否支持c-11"><a href="#_13-4-vs系列的看是否支持c-11" class="header-anchor">#</a> 13.4.VS系列的看是否支持<code>C++11</code></h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711192346868.png" alt="image-20210711192346868"></p> <h2 id="_14-三个主题c-11"><a href="#_14-三个主题c-11" class="header-anchor">#</a> 14.三个主题C++11</h2> <h3 id="_14-1-主题1、variadic-templates，数量不定的模板参数『震撼弹』"><a href="#_14-1-主题1、variadic-templates，数量不定的模板参数『震撼弹』" class="header-anchor">#</a> 14.1.主题1、<code>variadic templates</code>，<font style="background:yellow;">数量不定的模板参数</font>『震撼弹』</h3> <ul><li><font style="background:yellow;">这个主题在C++11中，『侯捷』说它是“震撼弹”，详细讲了好久</font></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711192744743.png" alt="image-20210711192744743"></p> <ul><li>其中，这一点事最重要的</li></ul> <h3 id="_14-2-语法糖的概念⭐️"><a href="#_14-2-语法糖的概念⭐️" class="header-anchor">#</a> 14.2.语法糖的概念⭐️</h3> <ul><li><font style="background:yellow;">另外2个是只是方便性，只是为你你使用方便。叫<strong>语法糖</strong></font>。</li> <li>补充：<strong>维基百科</strong>中『语法糖（<code>Syntactic sugar</code>）』是由英国<a href="https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6%E5%AE%B6" target="_blank" rel="noopener noreferrer">计算机科学家<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a><a href="https://zh.wikipedia.org/wiki/%E5%BD%BC%E5%BE%97%C2%B7%E5%85%B0%E4%B8%81" target="_blank" rel="noopener noreferrer">彼得·兰丁<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a>发明的一个术语，指<a href="https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%AF%AD%E8%A8%80" target="_blank" rel="noopener noreferrer">计算机语言<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a>中添加的某种语法，这种语法对语言的功能没有影响，但是更方便程序员使用。<strong>语法糖让程序更加简洁，有更高的可读性</strong></li> <li>variadic这个字眼呢，在过去我是查不到的『2016』，英文里面，没有这个字，这是生造出来的一个词，但是现在可能查得到了，因为英文也在不断增加新词语。vari开头的，就是可变，变化，它的意思就是模板参数可以变化。『回想一下，你对模板的理解！</li> <li><code>...</code>已经变成语言的一部分了！！！『所以我在写讲义的时候，要变得很小心。以前某个太多，我就...，现在变成这个了』</li> <li>上面那个模板，告诉我们，我这个模板函数接受的参数呢，两组，其中第1组只有1个也就是T，第2组叫argus，个数多少个，不知道。『叫作包！！』</li> <li>『注意，...出现的地方不一样哦！！自己去体会啊，也没有什么道理可言！语言语法就设计这样，这个没有什么道理可言。。』『注意使用：<code>...</code>的三个位置！<strong>！各自体会，没有道理可言，语法就是这</strong>样。。』<strong>还用了递归。</strong></li> <li><font style="background:yellow;">『注意：包是可以<strong>0-多个</strong>』『递归到最后，我们知道0个就就不OK，因此我们在最上面写了一个printf』</font></li> <li>『再强调：后面那一包，你<strong>并不是必须要递归，你可以拿后面那一包来继承，组合23，发挥你的想象』</strong></li></ul> <p><font style="background:yellow;">『<strong>我们在C++11那门课！！讲了6—7种方式</strong>，看看一个和一包可以什么样的应用！！在这我只谈，语法的部分到这来！』</font></p> <ul><li>『非常好用的语法，可以用用』</li> <li>『注意：可能你也会设计一个class或函数,也用到这种语法，<font style="background:yellow;">在这个里面，如果你想知道，这个『一包是几个』：你可以用<code>sizeof...(args)</code>这个命令。你要把它称作操作符，称作函数也可以。反正是语言给的一个东西『这里，说错了吧，是操作符吧。。』</font> <ul><li>记得要加<code>...</code></li> <li>『『<strong>整个标准库的，整个用了这个语法，翻修了一遍。。很多地方用上，，其实我们很在乎：：在新的语言规格出来，有新的语法，新的标准库有没有用上这些新的语法呢？？如果用上了，那说服力才是更高</strong>啊！！』</li> <li>『所以，我们往往会去看看标准库有没有采用这个』</li></ul></li></ul> <h3 id="_14-3-主题2、auto"><a href="#_14-3-主题2、auto" class="header-anchor">#</a> 14.3.主题2、auto</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711193225642.png" alt="image-20210711193225642"></p> <ul><li>『过去太长了，现在用auto进行修改。』
<ul><li>『另外：<strong>真是有的情况，类型真是写不出来，你的功力要非常非常高，你才写得出</strong>。某个东西的类型，比如说2.0的<code>lambas表达式</code>，2333』</li> <li>『不够，你使用auto的时候，一定要让编译器能够帮你推。所以你不能写成下面这样！！！打X的地方，意思是：当你这么写的时候，你并没有赋值给它，没有assign，编译器根本就不知道这个ide是什么，它也推导不出来，这样是不行的！』</li></ul></li> <li>极端的人，可能想，那所有的变量都用<code>lamba</code>就好了，2个不可取。即时，C++是一种帮你奠定基本素养的一个，所一，我们很强调变量的类型是什么。除非太长或不想写。全部用的话，除非你很清楚，作为一个初学者不好。</li> <li>『第2点，你还真不是都能用auto？，你看像这个，你总不能在每次变量声明的时候就赋值把。当然，如果你是，那当我没说233</li></ul> <h3 id="_14-4-主题3、新的for循环"><a href="#_14-4-主题3、新的for循环" class="header-anchor">#</a> 14.4.主题3、新的for循环</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711193353551.png" alt="image-20210711193353551"></p> <ul><li>for的语法的新形势。右手边是容器</li></ul> <h2 id="_15-reference-『引用』"><a href="#_15-reference-『引用』" class="header-anchor">#</a> 15.Reference 『引用』</h2> <h3 id="_15-1-面试-引用的本质⭐️"><a href="#_15-1-面试-引用的本质⭐️" class="header-anchor">#</a> 15.1.面试-引用的本质⭐️</h3> <ul><li><p>其实要传递的信息—<font style="background:yellow;">引用就是指针！</font>⭐️</p></li> <li><p>『啊，你怎么能讲这种话呢？引用就是指针。这2个都是一样的话，那为什么要2个。</p></li> <li><p>没错，它只是表示的<strong>形式不同，其实所有的编译器。看待引用，怎样去实现出引用，它都是用指针去做的！</strong>『关于，这个事情，我又设计了2张PPT，把这个讲得更加清楚一些！！』</p></li> <li><p><font style="background:yellow;">语法糖：只是包一个糖衣，让你方便写代码。</font></p></li> <li><p>上面是从内存的角度去看，看什么呢？</p></li> <li><p>我们的变量有3种，一种是值value本身，一种是它的指针，一种是引用。</p></li> <li><p>我要从内存的角度去探讨这3个东西。</p></li> <li><p>『地址就是指针的一种形式，指针就是一种地址形式』</p></li> <li><p>『关于<code>*</code>靠近p还是int，有2派人马。都可以！！但是我喜欢这种写法。』</p></li> <li><p>『第3行。</p></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711194307950.png" alt="image-20210711194307950"></p> <h3 id="_15-2-『sizeof-引用-编译器制造的假象』⭐️"><a href="#_15-2-『sizeof-引用-编译器制造的假象』⭐️" class="header-anchor">#</a> 15.2.『sizeof(引用)-<code>编译器制造的假象</code>』⭐️</h3> <ul><li>或许可以用汇编解释？</li></ul> <p>引用的特点：</p> <ul><li><p>1.从<strong>逻辑的角度</strong>，<code>reference</code>的意义是 『Java里面所有变量都是reference，不必特别写』</p></li> <li><p>2.reference是从一而终！</p></li> <li><p>3.<font style="background:yellow;">易错：<strong>对象</strong>和其引用『面试考点』</font></p> <ul><li>（1）<font style="background:yellow;">大小相同</font>『这些全都是假象！』</li> <li>（2）<font style="background:yellow;">地址也相同</font>『这些全都是假象！』
<ul><li>『原因：p应该多大，应该是指针大小，r多大呢？
那要看它代表的是什么东西，他代表的东西是多大，就代表它是多大。因为它是一体的面『注意这个说法！』</li> <li>『所以，<font style="background:yellow;">即使引用就是指针，大小应该是指针大小，
但是——编译器必须制造一种假象！这个假象是好的！</font></li> <li>什么假象呢？r代表x，所以，x如果是100个字节，r就必须是100个字节，而且x的地址在哪，p的地址就应该在哪。因为它代表它！</li></ul></li></ul></li> <li><p>测试代码如下：GNUC++，64位的平台</p></li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&lt;bits/stdc++.h&gt;</span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>

<span class="token keyword">class</span> <span class="token class-name">demo</span>
<span class="token punctuation">{</span>
	<span class="token keyword">public</span><span class="token operator">:</span>
		<span class="token keyword">int</span> a<span class="token punctuation">;</span>
		<span class="token keyword">int</span> b<span class="token punctuation">;</span>
		<span class="token keyword">int</span> c<span class="token punctuation">;</span>
		<span class="token function">demo</span><span class="token punctuation">(</span> <span class="token keyword">int</span> _a<span class="token punctuation">,</span> <span class="token keyword">int</span> _b<span class="token punctuation">,</span> <span class="token keyword">int</span> _c <span class="token punctuation">)</span><span class="token operator">:</span> 
		<span class="token function">a</span><span class="token punctuation">(</span>_a<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token function">b</span><span class="token punctuation">(</span>_b<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token function">c</span><span class="token punctuation">(</span>_c<span class="token punctuation">)</span>
		<span class="token punctuation">{</span>

		<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>

	demo <span class="token function">one</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	demo <span class="token operator">&amp;</span> two<span class="token operator">=</span>one<span class="token punctuation">;</span>
	demo <span class="token operator">*</span> p<span class="token operator">=</span><span class="token operator">&amp;</span>one<span class="token punctuation">;</span>

	cout <span class="token operator">&lt;&lt;</span> <span class="token string">&quot;sizeof（one）=&quot;</span> <span class="token operator">&lt;&lt;</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>one<span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
	cout <span class="token operator">&lt;&lt;</span> <span class="token string">&quot;sizeof（two）=&quot;</span> <span class="token operator">&lt;&lt;</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>two<span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
	cout <span class="token operator">&lt;&lt;</span> <span class="token string">&quot;sizeof（p）=&quot;</span> <span class="token operator">&lt;&lt;</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
	cout <span class="token operator">&lt;&lt;</span> <span class="token string">&quot;address（one）=&quot;</span><span class="token operator">&lt;&lt;</span> <span class="token operator">&amp;</span>one <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
	cout <span class="token operator">&lt;&lt;</span> <span class="token string">&quot;address（two）=&quot;</span> <span class="token operator">&lt;&lt;</span> <span class="token operator">&amp;</span>two <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
	cout <span class="token operator">&lt;&lt;</span> <span class="token string">&quot;address（p）=&quot;</span> <span class="token operator">&lt;&lt;</span> <span class="token operator">&amp;</span>p <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
	
	<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">//测试结果如下：</span>
<span class="token comment">/*
sizeof (one） =12
sizeof (two） =12	//注意这里：编译器制造的假象
sizeof (p）=8
address (one）=Ox7ffd27396bco
address (two）=Ox7ffd27396bco	//注意这里：编译器制造的假象
address (p）=Ox7ffd27396bb8
*/</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br></div></div><p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711194643886.png" alt="image-20210711194643886"></p> <h3 id="_15-3-『面试-个人补充』待考察"><a href="#_15-3-『面试-个人补充』待考察" class="header-anchor">#</a> 15.3.『面试-个人补充』待考察</h3> <ul><li>指针能否为空，引用能否为空？</li> <li>指针可以为空，<strong>引用必须是有实体的，不能存在空引用</strong></li></ul> <blockquote><p>参考<a href="https://blog.csdn.net/luansxx/article/details/10134139" target="_blank" rel="noopener noreferrer">博客<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a>：</p></blockquote> <h3 id="_15-4-传引用和传value是不能并存的『函数签名』⭐️"><a href="#_15-4-传引用和传value是不能并存的『函数签名』⭐️" class="header-anchor">#</a> 15.4.<code>传引用</code>和<code>传value</code>是不能并存的『函数签名』⭐️</h3> <ul><li>看这个例子：有句话说得好，引用就是一种漂亮的指针。<strong>引用在写代码的时候，其实我们很少说它的类型是个引用。</strong></li> <li><strong>引用，多半用到参数传递上！</strong></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711195024433.png" alt="image-20210711195024433"></p> <ul><li>从上到下：上面3个声明，我采用了3个参数的传递方法：
<ul><li><code>pass by value</code></li> <li><code>pass by pointer</code></li> <li><code>pass by reference</code></li></ul></li> <li>当你这样写的时候，后头的写法要使用这个参数，写法就不一样了！</li> <li>『我们说引用和传值，这2种写法一样，是很好的！也就表示，传进来的这个，都不影响后面的事情，这是很棒的事情』</li> <li><font style="background:yellow;">『注意：signature』注意：传引用和传value是不能并存的，因为他们的<code>签名（signature）</code>是相同的！『<code>就是括号部分，签名的部分是不含return type的』</code></font></li> <li>『这两个签名，为什么C++说相同呢？你可以想想：如果这2个被视为不同话，那就麻烦大了，和另外一件事情产生矛盾！编译器，在看到2和3那种类型的时候，编译器就不能判断你想调用谁？所以C++语法的创造者，发现这矛盾。二义和歧义</li></ul> <blockquote><p>HACV对『函数签名』的总结：</p></blockquote> <ul><li>1、函数签名是<font style="background:yellow;">从<code>函数名</code>开始到<code>{之前</code></font>『注意<code>{</code>前这个词汇的准确性』</li> <li>2、显然，函数签名包括()和{}之间的<code>const</code></li> <li>3、<strong>传引用和传value是不能并存的</strong>，因为他们的<code>签名（signature）</code>是相同的！
<ul><li>原因：编译器，在看到2和3那种类型的时候，编译器就不能判断你想调用谁？ 发生二义性！</li></ul></li></ul> <h3 id="_15-5-『const和签名』"><a href="#_15-5-『const和签名』" class="header-anchor">#</a> 15.5.『const和签名』</h3> <ul><li>注意：灰色可以加const</li> <li>const是函数前面的一部分。
<ul><li>原因：const的函数做不改变的，非const的做改变的</li></ul></li></ul> <h2 id="✅对象模型（object-model）"><a href="#✅对象模型（object-model）" class="header-anchor">#</a> ✅对象模型（Object Model）</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711195607636.png" alt="image-20210711195607636"></p> <blockquote><p>下面我们要谈的：是<font style="background:yellow;">对象模型，要谈论的是一些，从<strong>代码的层次上看不出来的一些底层的东西</strong>！</font></p></blockquote> <ul><li>要谈的是一些底层的一些看不到的东西，但是这个至关重要！『对于你了解整个面向对象的这个C++的事情』</li></ul> <h2 id="_16-复合-继承关系下的构造和析构"><a href="#_16-复合-继承关系下的构造和析构" class="header-anchor">#</a> 16.<code>复合&amp;继承</code>关系下的构造和析构</h2> <h3 id="_16-1-复合关系下的『构造和析构』"><a href="#_16-1-复合关系下的『构造和析构』" class="header-anchor">#</a> 16.1.复合关系下的『构造和析构』</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711200028958.png" alt="image-20210711200028958"></p> <ul><li>复合或者叫组合关系下：
<ul><li>我拥有你。</li> <li>要创建一个我的时候，<font style="background:yellow;"><strong>当我拥有你的时候，你就是内部</strong>。当然是从内部到外部！</font></li></ul></li> <li>可以想想如红色部分！</li></ul> <h3 id="_16-2-继承关系下的构造和析构"><a href="#_16-2-继承关系下的构造和析构" class="header-anchor">#</a> 16.2.继承关系下的构造和析构</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711200159555.png" alt="image-20210711200159555"></p> <p>3种类和类的关系：</p> <ul><li>继承</li> <li>组合或者叫复合的关系</li> <li>复合，有一个比较微弱的关系，叫作<code>delguation</code>，我只是有根指针指向，我不是真的拥有你</li></ul> <p>『下面讲得很不错！』</p> <ul><li><strong>构造由内而外</strong>：<font style="background:yellow;">一个东西如果有3层，那么当然是<strong>由内而外</strong>，这样<strong>才最扎实</strong>。</font> <ul><li>红色部分，其实就是编译器加在你身上的。<strong>编译器会为你加代码哦！使得你的构造函数在执行之前，会先调用父类的默认构造函数。『记住记住记住！！』</strong></li></ul></li> <li><strong>析构顺序</strong>：你要把一个东西剥离而来，剥皮</li></ul> <h3 id="_16-3-继承和组合关系下的『构造和析构』"><a href="#_16-3-继承和组合关系下的『构造和析构』" class="header-anchor">#</a> 16.3.继承和组合关系下的『构造和析构』</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711201610071.png" alt="image-20210711201610071"></p> <ul><li>前面2个事呢，是面向对象的本职学能。是面向对象一定要有的基础。。</li> <li>『我们这个呢，是把继承和组合放在一起！』</li></ul> <h3 id="_16-4-c-规格书没有说的『坑』⭐️✅"><a href="#_16-4-c-规格书没有说的『坑』⭐️✅" class="header-anchor">#</a> 16.4.C++规格书没有说的『坑』⭐️✅</h3> <p>构造顺序：</p> <ul><li>1、关于先放Base还是被组合的？？<font style="background:yellow;">其实C++语言，<strong>我不记得，在它的规格书里面有谈论这个事情</strong>！</font></li> <li>所以，<font style="background:yellow;">以我<strong>目前的认知，这是属于实现的部分</strong>，也许在不同编译器上，对这个事情，它的次序不太一样！</font>『而这个次序不同，并不会影响C++语法的一致性！并不会造成矛盾。所以『应该是属于实现手法的不同而已！！』</li> <li>2、我们继续分析。关于谁先谁后，我不敢确定是语言规则上的设定。
<ul><li>但是我可以告诉你，『**在我手上用的编译器！』所看出来的结果在上面！！『黄色部分』这是观察出来的结果！**如果把这个表现出来是红色</li></ul></li></ul> <h2 id="_17-关于vptr和vtbl"><a href="#_17-关于vptr和vtbl" class="header-anchor">#</a> 17.关于<code>vptr</code>和<code>vtbl</code></h2> <ul><li>现在我们来看看，更加底层的东西！现在要谈到，在整个领域里面，赫赫有名的2个名词。
<ul><li><code>虚指针和虚表</code></li></ul></li> <li>这个完全是代码层次看不到的东西！</li></ul> <h3 id="_17-1-虚指针和虚表的『核心图』⭐️"><a href="#_17-1-虚指针和虚表的『核心图』⭐️" class="header-anchor">#</a> 17.1.虚指针和虚表的『核心图』⭐️</h3> <ul><li><font style="background:yellow;">自己给自己补充：以前C语言中函数被编译之后的机器代码放在哪？</font></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711202412877.png" alt="image-20210711202412877"></p> <ul><li>当一个类有虚函数的时候，虚函数是面向对象里面最重要的一部分哦。如果只是在谈继承，而没有虚函数，其实用途不太大！当然有用途。只有类里面有1或1W个虚函数，这个对象里面就会多一根指针。</li></ul> <blockquote><p>关于继承的思考：</p></blockquote> <ul><li>注意：什么叫继承，大家都会去从内存的角度去向，哦，继承就是去把数据全部继承下来，这个话没有错误。但还会把函数给继承下来！那函数多大？不可解！！没有人能够回答你，一个函数占用内存多大！
<ul><li>所以，<font style="background:yellow;"><strong>所谓函数继承，是继承函数的调用权！不是继承它的内存大小</strong>！</font></li></ul></li> <li>『那么一般的函数和虚函数，它在内存里面长什么样子呢？给的例子A、B、C</li> <li>『注意：B已经继承A的两个虚函数了，推翻其中一个！我会推翻就是**改写！『override』**那么第2个呢，就是继承下来，没有改写。另外func1和func2这两个函数虽然有和A中同名，但是能，这两个是A的函数，下面的是B的函数，这两个函数同名，其实一点关系都没有。『这个当然不太理想啊，我们不应该子类写一个函数和父类同名。</li> <li>『所以，现在A、B、C总共有多少个函数呢？8个、这个图标牛皮』『非虚函数4个，虚函数4个』</li> <li>『这些函数，它是代码，当然是占内存的一块，多大块，无所谓』</li> <li>『注意：B基础了A的虚函数1，但是它自己同时也重写了』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711204247841.png" alt="image-20210711204247841"></p> <h3 id="_17-2-关键点：观察如何找虚指针！⭐️"><a href="#_17-2-关键点：观察如何找虚指针！⭐️" class="header-anchor">#</a> 17.2.关键点：观察如何找虚指针！⭐️</h3> <ul><li><p>现在，我们假设有一个指针p指向对象C，你看图『通过这个指针，要调用v1，编译器看到一个调用的动作，在过去在C语言的时代！：它一定是把它编译成一个特定的语法！！call XXX，最后ret回来，这一种叫作『静态绑定』』</p></li> <li><p>『可是现在，如果通过指针去调用虚函数的话，编译器就知道。不能做静态。。因为这就是面向对象设计者的关键点。。它不做静态绑定，它做动态绑定。』</p></li> <li><p>『动态绑定的逻辑意义就是这样：通过这个指针，找到vptr，然后找到vtbl，然后从里头找到它看看他到底指向哪个函数，走到哪条路线』<font style="background:yellow;">关键点**：指针p是如何找到vptr**的，这个就能知道指针类型和那个指针真正指向的位置啥的『2021年HACV自己的思考』</font></p></li> <li><p>『这条路线走过来，解析成C的形式下下面的样子！！』『这个路线是非常下的！！！』</p></li> <li><p>『有时候，我也顺手写过一些东西，可能是错误的，所以要沿着，下面是验证了的』
<code>( *(p-&gt;vptr)[n] ) (p);</code></p></li></ul> <h3 id="_17-3-『面试常考-动态绑定3条件』⭐️"><a href="#_17-3-『面试常考-动态绑定3条件』⭐️" class="header-anchor">#</a> 17.3.『面试常考-<code>动态绑定3条件</code>』⭐️</h3> <blockquote><p>C++编译器，看到一个函数调用，他有2个考量，静态还是动态绑定：</p></blockquote> <ul><li><p>静态被编译成：<code>call</code></p></li> <li><p><font style="background:yellow;">动态绑定：符合某些条件就会做动态绑定，<strong>3个条件</strong></font></p> <ul><li>1、通过<strong>指针来调用『注意，引用显然也是</strong>的，因为底层也是指针』</li> <li>2、这个指针是<strong>向上转型</strong><code>up cast</code>了。『比如，派生类赋值给基类指针，基类指针调用』</li> <li>3、<strong>调用虚函数</strong></li></ul></li> <li><p>只要符合这3个条件，编译器就把这个调用动作，编译成这种样子『这条路线，我们就把它叫做：虚机制，<code>virtual metakll</code>』</p> <ul><li>因此，这样调用的是什么函数呢？不一定。<font style="background:yellow;">要看P指的是什么？</font>所以才叫动态绑定。『而这种虚函数的这种用法，我们叫多态。。』</li></ul></li> <li><p>虚函数、动态绑定、走的是虚指针+虚函数表，其实这些都是同一件事情。你把这些事情都弄得非常清楚，对于整个面向对象，就是了然于胸。</p></li></ul> <h2 id="_18-关于this指针『另一个对付虚机制的法宝』⭐️"><a href="#_18-关于this指针『另一个对付虚机制的法宝』⭐️" class="header-anchor">#</a> 18.关于<code>this</code>指针『另一个对付虚机制的法宝』⭐️</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711204947708.png" alt="image-20210711204947708"></p> <ul><li><p>this指针。『简单来说，<font style="background:yellow;">你通过一个对象来调用一个函数，那个对象的地址，就是this指针。（这句话请深刻理解）</font>』</p> <ul><li>但是，我特别要强调，你对this指针这个概念要很清晰。<strong>因为你在分析一个继承体系的时候，或者是你自己在设计继承体系那个调用的时候。你如果没有很清楚this，你会迷失在那个丛林里面。谁调用谁就搞不清楚『确实！！！！』</strong></li></ul></li> <li><p>『<strong>首先，这种用法是叫作模板方法，是一种设计模式的名称</strong>，现在不去谈论设计模式，我们就专注在虚函数的用法上。。』</p></li> <li><p>『我自己的归纳：虚函数在使用的时候：</p> <ul><li>1、一个是多态</li> <li>2、一个是模板方法。</li></ul></li></ul> <h3 id="_18-1-『this指针—分析继承体系的金钥匙』⭐️"><a href="#_18-1-『this指针—分析继承体系的金钥匙』⭐️" class="header-anchor">#</a> 18.1.『<code>this指针</code>—<code>分析继承体系的金钥匙</code>』⭐️</h3> <ul><li>带你感受一下，面向对象用虚函数的好处。但是为什么你这么写，会有这样好的过程呢？</li> <li>『子类的对象调用父类的函数，当然可以，你可不可以用你爸爸的钱呢，可以啊，这个例子不知道好不好。</li> <li>『谁调用我，谁就是那个this』</li> <li><code>this</code>是个关键字也是一个观念，this是根指针，this有时候也可以说：<code>this obeject</code>，意思就是说this所指向的obeject。</li> <li>这就必须请出汇编代码了。</li></ul> <h2 id="_19-关于dynamic-binding『动态绑定』"><a href="#_19-关于dynamic-binding『动态绑定』" class="header-anchor">#</a> 19.关于<code>Dynamic Binding</code>『动态绑定』</h2> <blockquote><p>关于<code>Dynamic Binding</code>，动态绑定！</p></blockquote> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711205224008.png" alt="image-20210711205224008"></p> <ul><li>我们能够看懂汇编的人越来越少了。经过我这么解释你大略懂就行。不必真的懂。</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711205256975.png" alt="image-20210711205256975"></p> <ul><li><code>紫色123行</code>，是<code>向上转型</code>，所以动态绑定！</li> <li>『最重要的是哪个call，但是这个call不再是一个固定的地址！请对比上一行，最后的静态绑定。『我们现在通过这个，告诉我们确实是那样去调用那里的！！』</li></ul> <blockquote><p>这个课程到底结束。</p></blockquote> <h2 id="✅『补充主题const』"><a href="#✅『补充主题const』" class="header-anchor">#</a> ✅『补充主题<code>const</code>』</h2> <blockquote><p>课程结束了，又回来，各位有点奇怪：</p></blockquote> <ul><li>在结束之后，我感觉有2个主题还值得和大家提一下！！</li> <li>1、<code>const</code></li> <li>2、动态分配，和<code>new</code>和d<code>elete</code>有关，『其实这2个主题在Part1有提过，这里还要再强调一下！』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711205506617.png" alt="image-20210711205506617"></p> <blockquote><p>疑问？下面这句话，到底说明啥？？</p></blockquote> <h3 id="temp-1-『const不能放置的？』"><a href="#temp-1-『const不能放置的？』" class="header-anchor">#</a> temp.1.『const不能放置的？』</h3> <ul><li>注意：const放置的位置：<font style="background:yellow;"><strong>const是只能放在成员函数的后头的，一般的全局函数是不能在这个位置放置const的，不可以！！</strong></font>『思考：或许static也不OK』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210711205719915.png" alt="image-20210711205719915"></p> <ul><li><p>更详细的来说：</p></li> <li><p>一般来说，成员函数是要去操作Data，</p> <ul><li>1、但是const告诉编译器：我操作可以，但是我可能只是读，我不会去改，这就是我的意图，我要告诉编译器。然后，请编译器帮我把关，看看我有没有违反你的意图。所以，我们现在要用这个表的这种交互关系。为大家阐明交代，交代什么事情呢？</li> <li>2、就是对象调用函数的时候，，对象可能是const也可能不是const!!</li> <li>3、之间的交互，组成了这4种。</li></ul></li></ul> <blockquote><p>『C++中const的组合』</p></blockquote> <ul><li>C++里面的很多的规则，其实都是，只要理解它内部的原理，都不用背！但是在不理解这些原理前，你可能要背，背景的又容易忘记，不知道真正的意义是什么？』</li> <li>『就像Part谈论过的<code>static</code>,要不要加，加了之后，谁可以调用谁？，谁不能调用谁，这些背后都有一些比较底层的基础意义。。』</li></ul> <h3 id="temp-2-『非常易错的结论』-写时复制"><a href="#temp-2-『非常易错的结论』-写时复制" class="header-anchor">#</a> temp.2.『非常易错的结论』+<code>写时复制</code></h3> <ul><li>打X的那个很常见吗啊？我们看代码</li> <li>这也告诉我们，记得该加const就一定要加const</li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>右边的节选代码：
    为什么右边那么设计？？
    我们使用的标准库的设计方式是：引用计数。
    总只是可以共享，这<span class="token number">4</span>个字符串其实是可以共享。
    这个共享的内容是属于设计模式的一部分，我们现在不去谈它。。
    
    万一其中一个人变卦了，要改内容，其他人就会受影响。
    
    当然，如果没有共享，那么就必须做Copy on Write的动作。
    
    而，如果常量字符串，那就不必要改内容。。所以就不必要拷贝。
    必须区分开来，我们就才能够写出两个版本。
    
    但是这样写完之后，有一个破绽！！！
    就是表格中，如果非consr对象也可以调用<span class="token keyword">const</span>成员函数、、
    这样我就不知道调用的哪一种。。这样的话
    
『易错的』
    在『表格中规则』之外，C<span class="token operator">++</span>又有一条规则，就是上面灰色的！！
    当一个成员函数的<span class="token keyword">const</span>和非<span class="token keyword">const</span>成员版本同时存在，，巴拉巴拉。。『难点，易错。』
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br></div></div><ul><li><font style="background:yellow;">标准库是我们学习的一个很好的老师</font>，如果你打开标准库。其实每个人手上都有头文件。</li> <li>其实每个class有的是const有的不是const，菜鸟级的都没有加const</li></ul> <h2 id="_20-关于new-delete"><a href="#_20-关于new-delete" class="header-anchor">#</a> 20.关于New,Delete</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712080520628.png" alt="image-20210712080520628"></p> <ul><li>其实new的分解动作，这边delete的分解动作。其实谈得很深入了。</li></ul> <h3 id="_20-1-『new和delete一系列混淆概念』"><a href="#_20-1-『new和delete一系列混淆概念』" class="header-anchor">#</a> 20.1.『<code>new</code>和<code>delete</code>一系列混淆概念』</h3> <ul><li>1、上面的<code>new和delete</code>都是叫：<code>expression new</code>表达式！</li> <li><font style="background:yellow;">『我们使用者直接在用的叫作expression表达式，<strong>表达式的行为是不能变的，是不能重载的</strong>！</font>『『这句话表明了，侯捷为啥那么分类，这下，我大概懂它的意思了，虽然，我还是觉得<code>new</code>和<code>operator new</code>就是一个东西，毕竟《C++ Primer》中都说new是运算符。</li> <li>也就是new分解为<code>1-3</code>，delete分解为<code>1-2</code>，，但是分解下去的那个函数可以重载！！『核心话语』』，至于，new表达式，它分解进去的叫作：<code>operator new</code></li> <li>3、而这些<code>operator new</code>啥的，底层其实是调用malloc，而malloc的区块分配到的区块长什么样？告诉在这里『右边，当然这里在我的另外课程内存管理谈论得更深入，更深啊。』</li></ul> <h3 id="_20-2-『侯捷的失误』"><a href="#_20-2-『侯捷的失误』" class="header-anchor">#</a> 20.2.『<code>侯捷的失误</code>』</h3> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token number">4</span>、我的思考：『我们记忆过C<span class="token operator">++</span>中不能重载的，其中没有<span class="token keyword">new</span>和<span class="token keyword">delete</span>，那么应该是能重载的，但是侯捷的这里的分类方式，好像我们就不能那么记忆？？
    所以，我的看法是，侯捷这个地方讲错了！！！包括内存管理中说<span class="token keyword">new</span>不能重载。。。但是无伤大雅，瑕不掩瑜。。。
    但是，好像从重载函数opeartoe <span class="token keyword">new</span>和<span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">[</span><span class="token punctuation">]</span>这<span class="token number">2</span>个角度来看。好像又成立。。
    不对，反驳自己，侯捷这里就是错了，，因为<span class="token keyword">new</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> 在《C<span class="token operator">++</span> primer》这本书中就是一种运算符。』
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><ul><li>5、另外：<code>中括号</code>的new和delete，术语叫做<code>array new</code>和<code>array delete</code></li> <li>6、先前没有告诉你，你的class其实可以重载这些函数。『有什么用呢？可能拿来做内存管理，做一些内存池的设计。内存池是个大的话题，，该怎么设计，不是这门课程要讲的。但是这边属于C++语言的部分，我要告诉你，这些函数的重载的形式』</li></ul> <h2 id="_21-operator-new，operator-delete"><a href="#_21-operator-new，operator-delete" class="header-anchor">#</a> 21.<code>operator new</code>，<code>operator delete</code></h2> <ul><li>重载全局的new，<code>::operator new</code></li></ul> <p>（0）参考资料</p> <blockquote><p>运算符new和array new的引出</p></blockquote> <ul><li>注意：C++中<code>new</code>和<code>delete</code>和<code>new []</code>和<code>delete []</code>都是运算符</li> <li>运算符<code>new</code>和<code>delete</code>是动态分配内存和动态释放内存</li> <li>运算符<code>new []</code>和<code>delete []</code>是动态分配数组和动态释放数组</li> <li>然后，这几个运算符都可以重载啊</li></ul> <blockquote><p><code>operator new</code>的引出</p></blockquote> <blockquote><p>注意『易错的：加上了符号<code>::</code>的重载，就是全局的』</p></blockquote> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712080620562.png" alt="image-20210712080620562"></p> <ul><li>下面重载不是全局的</li></ul> <p>（1）重装全局的</p> <p>本节，我们要重载下面4个</p> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token operator">::</span><span class="token keyword">operator</span> <span class="token keyword">new</span>		<span class="token comment">//因为是全局的，所以『::』前面没有任何</span>
<span class="token operator">::</span><span class="token keyword">operator</span> <span class="token keyword">delete</span>	<span class="token comment">//因为是全局</span>
<span class="token operator">::</span><span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token operator">::</span><span class="token keyword">operator</span> <span class="token keyword">delete</span><span class="token punctuation">[</span><span class="token punctuation">]</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>解释</p> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token number">1</span>、加上符号『<span class="token operator">::</span>』是表示全局的
<span class="token number">2</span>、<span class="token operator">::</span><span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">[</span><span class="token punctuation">]</span>这个表示的是  array <span class="token keyword">new</span>  
『数组的』
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ul><li>如何重载呢？就是下面这4部分代码</li> <li>有关new的部分，一定要有一个参数，就是大小『size_t size』</li> <li>注意，下面写好的函数，其实不会是你调用的，刚刚讲过了new会切成3个动作，这个Part1已经讲过了，3个动作的第1个动作，当你有重载就跑到你这里来，你没有重载就用全局。而这些函数，当然要知道大小，这是谁存进来的呢？编译器。这个函数写出来是给编译器调用的</li> <li>下面就是它们的形式它的接口，至于进去之后，要做什么，那是我们的事情，没有人教我们做什么。『在这个地方，我们为了要接管这个动作，所以我们写了这么4个函数，我要接管呢，但我又不要失常！！这是真正在分配内存，万一我们没有分配内存的话，这个程序会宕掉，会crash掉，所以我接管之后没有做太多的事情，我仅仅是在之前的基础上打印点东西。程序还是正常运作）</li> <li>注意：我们写的这个的影响是『无远弗届』，影响层面非常广，因为你现在重载的是全局。成语：释义，不管多远之处，没有不到的。</li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>
<span class="token keyword">void</span> <span class="token function">myAlloc</span><span class="token punctuation">(</span> size_t size <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token function">malloc</span><span class="token punctuation">(</span> size <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">myFree</span><span class="token punctuation">(</span> <span class="token keyword">void</span><span class="token operator">*</span> ptr <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token function">free</span><span class="token punctuation">(</span>ptr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>


<span class="token comment">//他们不可以被声明于一个namespace内</span>
<span class="token comment">//『HACV的解读是，由于是全局的，所以namespace约束他们的话，就会出错』</span>
<span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token operator">*</span> <span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">(</span> size_t size <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    cout<span class="token operator">&lt;&lt;</span><span class="token string">&quot;global new()   /n&quot;</span><span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token function">myAlloc</span><span class="token punctuation">(</span> size <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token operator">*</span> <span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> size_t size <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    cout<span class="token operator">&lt;&lt;</span><span class="token string">&quot;global new[]()   /n&quot;</span><span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token function">myAlloc</span><span class="token punctuation">(</span> size <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token keyword">operator</span> <span class="token keyword">delete</span><span class="token punctuation">(</span> <span class="token keyword">void</span><span class="token operator">*</span> ptr <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    cout<span class="token operator">&lt;&lt;</span><span class="token string">&quot;global delete()   /n&quot;</span><span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token function">myFree</span><span class="token punctuation">(</span> ptr <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token keyword">operator</span> <span class="token keyword">delete</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> <span class="token keyword">void</span><span class="token operator">*</span> ptr <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    cout<span class="token operator">&lt;&lt;</span><span class="token string">&quot;global delete[]()   /n&quot;</span><span class="token operator">&lt;&lt;</span>endl<span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token function">myFree</span><span class="token punctuation">(</span> ptr <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br></div></div><p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712080706561.png" alt="image-20210712080706561"></p> <p>（2）重载class里面的</p> <ul><li>从前面，联想到：我也可以<strong>对一个class里头</strong>的成员『operator new或者operator delete』做重载</li> <li>我们下面来重载：member operator new/delete</li> <li>刚刚那个是全局啊，现在是在class里头</li> <li>现在我们就能接管了。。我们接管之后做什么事情？？做一个内存池。。</li></ul> <p>『如何写呢？写法如下』</p> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token keyword">class</span> <span class="token class-name">Foo</span>
<span class="token punctuation">{</span>
    <span class="token keyword">public</span><span class="token operator">:</span>
    	<span class="token keyword">void</span> <span class="token operator">*</span> <span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">(</span> size_t <span class="token punctuation">)</span><span class="token punctuation">;</span>
    	<span class="token keyword">void</span> <span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span> <span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">,</span> size_t <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>1、展示class的new是如何使用的</p> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>Foo <span class="token operator">*</span>p <span class="token operator">=</span> <span class="token keyword">new</span> Foo<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>分解为下面3个动作</p> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token keyword">try</span>
<span class="token punctuation">{</span>
    <span class="token keyword">void</span> mem <span class="token operator">=</span> <span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">(</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>Foo<span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//第1步，这不就用上了吗</span>
    p<span class="token operator">=</span><span class="token keyword">static_cast</span><span class="token operator">&lt;</span>Foo <span class="token operator">*</span> <span class="token operator">&gt;</span><span class="token punctuation">(</span>mem<span class="token punctuation">)</span><span class="token punctuation">;</span>
    p<span class="token operator">-&gt;</span><span class="token class-name">Foo</span><span class="token operator">::</span><span class="token function">Foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token keyword">delete</span> p
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>分解为2步</p> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>p<span class="token operator">-&gt;</span> <span class="token operator">~</span><span class="token function">Foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//第1步</span>
<span class="token keyword">operator</span> <span class="token keyword">delete</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>2、重载class中的new[]</p> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>Foo <span class="token operator">*</span>p <span class="token operator">=</span> <span class="token keyword">new</span> Foo<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>分解为下面</p> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code><span class="token keyword">try</span>
<span class="token punctuation">{</span>
    <span class="token keyword">void</span> mem <span class="token operator">=</span> <span class="token keyword">operator</span> <span class="token keyword">new</span><span class="token punctuation">(</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>Foo<span class="token punctuation">)</span><span class="token operator">*</span>N<span class="token operator">+</span><span class="token number">4</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//第1步</span>
    p<span class="token operator">=</span><span class="token keyword">static_cast</span><span class="token operator">&lt;</span>Foo <span class="token operator">*</span> <span class="token operator">&gt;</span><span class="token punctuation">(</span>mem<span class="token punctuation">)</span><span class="token punctuation">;</span>
    p<span class="token operator">-&gt;</span><span class="token class-name">Foo</span><span class="token operator">::</span><span class="token function">Foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//注意是N次，，这个地方我们也可以知道这个为什么构造基础</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><blockquote><p>注意啊，有没有[]表示，一个是数组，一个是</p></blockquote> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>也解决了疑惑，为什么释放数组是
    
    <span class="token keyword">delete</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> a<span class="token punctuation">;</span><span class="token comment">///2333，牛皮</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712080738196.png" alt="image-20210712080738196"></p> <h2 id="_22-示例-22"><a href="#_22-示例-22" class="header-anchor">#</a> 22.示例 22</h2> <ul><li>现在写一个相对完整的程序</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712080825808.png" alt="image-20210712080825808"></p> <ul><li>注意：：：如果使用者这么用的话，，那么就能强制跳过你这个class中国设计的，而是使用全局的『难道那么勾心斗角吗，2333，没有』『作为使用者和设计者之间，，恐怕大多数人从来不知道可以这样做。。』</li></ul> <p>测试</p> <ul><li>接口的示例！</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712080908136.png" alt="image-20210712080908136"></p> <ul><li>一个对象的大小『sizeof，你记得哈：：你也许不知道<strong>string的大小，我告诉你，它里头其实是个指针！所以是指针大小</strong>』 <font style="background:yellow;">此处说法错误！</font></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712080955930.png" alt="image-20210712080955930"></p> <h3 id="_22-1-『易错-前面加上了cout这种设计』"><a href="#_22-1-『易错-前面加上了cout这种设计』" class="header-anchor">#</a> 22.1.『易错-前面加上了cout这种设计』</h3> <ul><li>在GNUC底下，当你要一个。array的时候，<strong>他把array的整个大小再加上一个计数器『HACV：或许用static就可以实现』</strong>，整包来分配内存。</li> <li>这是合理的。『这种做法，</li></ul> <blockquote><p>到这里，我们知道：</p> <p>我们可以重载全局的，可以重载成员函数的，分别是对单一对象的这种版本或者是对数组这种、！！</p></blockquote> <h2 id="_23-重载new-delete-示例-23"><a href="#_23-重载new-delete-示例-23" class="header-anchor">#</a> 23.重载<code>new()</code>,<code>delete()</code>$示例  23</h2> <ul><li>你还可以重载<code>::</code>这种特殊形式，这个叫作<code>placement new</code>，它的形式『注意用起来的形式是那样。这个和先前不同，先前是直接<code>new classname</code>，并没有中间这一段。。现在允许你加上这一段。就是带上小括号的这部分。</li> <li>『重载的前提，请仔细看！！』</li></ul> <h3 id="_23-1-placement-new『好像是乱入的知识点』"><a href="#_23-1-placement-new『好像是乱入的知识点』" class="header-anchor">#</a> 23.1.<code>placement new</code>『好像是乱入的知识点』</h3> <blockquote><p>关于placement new的说法，公说公有理婆说婆有理。</p> <p><font style="background:yellow;">有人和侯捷的不一样，说，必须传入的是指针，“定位”一词才有意义</font></p></blockquote> <h3 id="_23-2-『whoway关于placement-new的思考』"><a href="#_23-2-『whoway关于placement-new的思考』" class="header-anchor">#</a> 23.2.『whoway关于<code>placement new</code>的思考』</h3> <ul><li>我看完placement new的所谓定义。『不就是变化后的<code>opeartor new</code>的推广吗。并且给一些限制，本质还是operator new』</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712081233563.png" alt="image-20210712081233563"></p> <h3 id="_23-3-『关于delete的疑问』"><a href="#_23-3-『关于delete的疑问』" class="header-anchor">#</a> 23.3.『关于delete的疑问』</h3> <ul><li>到这里，我们看到了4个版本的operator new，那我可不可以有4个不同的operator delete呢？</li> <li>回答：我们也可以！我没有讲也必须啊！我讲也可以！</li> <li>『但是绝不会被调用、但是只有当抛出出异常。也行你现在感受不到，待会，我给你看我的一个设计，再来看这个文字，会更清晰。</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712081306618.png" alt="image-20210712081306618"></p> <ul><li>测试</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712081341200.png" alt="image-20210712081341200"></p> <ul><li>这4个operator delete被调用的时机只有一个。——就是它们对应的那个兄弟，operator new分配内存之后，接下来会调用构造函数。。如果构造函数发出异常，表示在一个对象的构造过程当中，失败。</li></ul> <h3 id="_23-4-『工程经验』"><a href="#_23-4-『工程经验』" class="header-anchor">#</a> 23.4.『工程经验』</h3> <ul><li>『注意，我设计了，但是为啥没有输出。。『关于异常：<strong>如果作为一个经验不是太多的C++程序员，一般还不会去碰触到异常</strong>！exception，我<strong>有专门的一门课，专门在讲异常</strong>』</li> <li>『异常一直传递到函数—<code>terminal</code>，然后最后还调用到epo??只有在最后阶段，才会打印出这个字出来。。可是我期待的是，在这个之前，这里应该有一个函数。怎么没有输出呢？？看这段注解。。『GNUC4.9没有调用，但是以前<code>GNUC2.9</code>调用了。所以，这里就算是一个很隐晦的部分。。不知道啊。。每个人手上的编译器测试一下。</li></ul> <blockquote><p>『高级debug？？我的设想』</p></blockquote> <h2 id="_24-basic-string使用new-extra-扩充申请量"><a href="#_24-basic-string使用new-extra-扩充申请量" class="header-anchor">#</a> 24.<code>Basic_String</code>使用<code>new(extra)</code>扩充申请量</h2> <blockquote><p>来自string的源代码？？</p></blockquote> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210712081524504.png" alt="image-20210712081524504"></p> <ul><li>这个是『标准库』的例子，看看他是<code>怎么去改变operator new</code>。而且是小括号的这个new，也就是所谓的<code>placement new</code></li></ul> <div class="language-cpp line-numbers-mode"><pre class="language-cpp"><code>现在我们的<span class="token keyword">new</span>有多少种？？
    <span class="token keyword">new</span>表达式
    <span class="token keyword">operator</span> <span class="token keyword">new</span>
    array <span class="token keyword">new</span>
    placement <span class="token keyword">new</span>
    『HACV说——我觉得这个分类是错误的。』
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><ul><li>我们什么时候，需要重新定义<code>placement new</code>呢？</li> <li>当我像向他这样，<strong>无声无息的多分配一些东西的时候</strong>。</li></ul> <h2 id="参考资料"><a href="#参考资料" class="header-anchor">#</a> 参考资料</h2> <ul><li>C++<a href="https://mooc.study.163.com/smartSpec/detail/1001137001.htm" target="_blank" rel="noopener noreferrer">网易云微专业<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a>，侯捷</li></ul></div> <div class="page-edit"><!----> <!----></div> <!----> </div> <!----></div></div>
    <script src="/assets/js/app.c70e21ad.js" defer></script><script src="/assets/js/29.8ec842e9.js" defer></script>
  </body>
</html>
